# ALTER PROCEDURE
#### 功能描述
修改自定义存储过程的属性或重编译存储过程。
#### 注意事项
- 只有存储过程的所有者或者被授予了存储过程ALTER权限的用户才能执行ALTER PROCEDURE命令，系统管理员默认拥有该权限。针对所要修改属性的不同，还有以下权限约束：
  - 如果存储过程中涉及对临时表相关的操作，则无法使用ALTER PROCEDURE。
  
  - 修改存储过程的所有者或修改存储过程的模式，当前用户必须是该存储过程的所有者或者系统管理员，且该用户是新所有者角色的成员。
  
  - 只有系统管理员和初始化用户可以将存储过程的模式修改成public。
   
 
- 仅有初始用户或者创建该存储过程的用户可以修改存储过程为定义者权限的存储过程。
- 当打开三权分立时，对于定义者权限的存储过程，不允许任何角色修改存储过程的所有者。
- 当关闭三权分立时，对于定义者权限的存储过程，仅初始用户和系统管理员可以修改存储过程的所有者。
- 只有初始用户才能修改存储过程的所有者为初始用户。
#### 语法格式
- 修改自定义存储过程的附加参数
  ```
  ALTER PROCEDURE procedure_name ( [ { [ argname ] [ argmode ] argtype} [, ...] ] )
      action [ ... ] [ RESTRICT ];
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002793788365.png "点击放大")
  其中，附加参数action子句语法为：
  ```
  {{CALLED ON NULL INPUT  | RETURNS NULL ON NULL INPUT | STRICT}
   | {IMMUTABLE | STABLE | VOLATILE}
   | {SHIPPABLE | NOT SHIPPABLE}
   | {NOT FENCED | FENCED}
   | [ NOT ] LEAKPROOF
   | { [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER }
   | AUTHID { DEFINER | CURRENT_USER }
   | COST execution_cost
   | ROWS result_rows
   | SET configuration_parameter { { TO | = } { value | DEFAULT }| FROM CURRENT}
   | RESET {configuration_parameter | ALL}}
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002793708169.png "点击放大")
  
- 修改自定义存储过程的名称
  ```
  ALTER PROCEDURE procedure_name( [ { [ argname ] [ argmode ] argtype} [, ...] ] )
      RENAME TO new_name;
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002764469556.png "点击放大")
  
- 修改自定义存储过程的所有者
  ```
  ALTER PROCEDURE procedure_name( [ { [ argname ] [ argmode ] argtype} [, ...] ] )
      OWNER TO new_owner;
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002764309628.png "点击放大")
  
- 修改自定义存储过程的模式
  ```
  ALTER PROCEDURE procedure_name( [ { [ argname ] [ argmode ] argtype} [, ...] ] )
      SET SCHEMA new_schema;
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002764309626.png "点击放大")
  
 
#### 参数说明
- **procedure_name**
  要修改的存储过程名称。
  取值范围：已存在的存储过程名。
  
- **argmode**
  用于标识该参数是输入参数或输出参数。
  取值范围：IN、OUT、INOUT或VARIADIC。
  
- **argname**
  参数名称。
  取值范围：字符串，要符合[标识符命名规范](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0003.html#ZH-CN_TOPIC_0000002793787739__section14873217506)。
  
- **argtype**
  存储过程参数的类型。
  
- **CALLED ON NULL INPUT**
  表明该存储过程的某些参数为NULL时，可以按照正常的方式调用。缺省时与指定此参数的作用相同。
  
- **RETURNS NULL ON NULL INPUT \|** **STRICT**
  STRICT：用于指定当一个存储过程的某个参数为NULL时，则该存储过程返回NULL。如果声明了该参数，则如果存在NULL参数时不会执行该存储过程，而直接自动返回一个NULL结果。
  RETURNS NULL ON NULL INPUT和STRICT的功能相同。
  
- **IMMUTABLE**
  表示该存储过程在给出同样的参数值时总是返回同样的结果。
  
- **STABLE**
  表示该存储过程不能修改数据库，对相同参数值，在同一次表扫描里，该存储过程的返回值不变，但是返回值可能在不同SQL语句之间变化。
  
- **VOLATILE**
  表示该存储过程值可以在一次表扫描内改变，不会做任何优化。
  
- **SHIPPABLE \| NOT SHIPPABLE、** **FENCED** **\|** **NOT FENCED** 等
  行为约束可选项。各参数的功能与[CREATE FUNCTION](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0249.html)类似，详细说明请参见[CREATE FUNCTION](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0249.html)。
  
- **LEAKPROOF**
  表示该存储过程没有副作用，指出参数只包括返回值。LEAKPROOF只能由系统管理员设置。
  
- **EXTERNAL**
  （可选）目的是和SQL兼容，这个特性适合于所有函数，而不仅是外部函数。
  
- **SECURITY INVOKER** **\|** **AUTHID CURRENT_USER**
  表明该存储过程将以调用者的用户的权限执行。缺省时与指定此参数的作用相同。
  SECURITY INVOKER和AUTHID CURRENT_USER的功能相同。
  
- **SECURITY DEFINER** **\|** **AUTHID DEFINER**
  声明该存储过程将以创建者的用户的权限执行。
  AUTHID DEFINER和SECURITY DEFINER的功能相同。
  
- **COST execution_cost**
  用于估计存储过程的执行成本。
  execution_cost以cpu_operator_cost为单位。
  取值范围：正数。
  
- **ROWS result_rows**
  估计存储过程返回的行数。用于存储过程返回的是一个集合。
  取值范围：正数，默认值是1000。
  
- **configuration_parameter**
  - **value**
    将指定的数据库会话参数值设置为具体值。
    取值范围：字符串。
    - DEFAULT：在新的会话中使用系统的缺省设置。
    
    - OFF：关闭设置。
    
    - RESET：在新的会话中使用系统的缺省设置。
    
    - 用户指定的值：需要满足修改参数的取值限制。
     
  
  - **DEFAULT**
    默认值。
    
  
  - **FROM CURRENT**
    取当前会话中的值设置为configuration_parameter的值。
    
   
- **ALL**
  所有运行时参数。
  
- **new_name**
  存储过程的新名称。要修改存储过程的所属模式，必须拥有新模式的CREATE权限。
  取值范围：字符串，要符合[标识符命名规范](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0003.html#ZH-CN_TOPIC_0000002793787739__section14873217506)。
  
- **new_owner**
  存储过程的新所有者。要修改存储过程的所有者，新所有者必须拥有该存储过程所属模式的CREATE权限。
  取值范围：已存在的用户角色。
  
- **new_schema**
  存储过程的新模式。
  取值范围：已存在的模式。
  
- **RESTRICT**
  仅为了符合SQL标准，可被忽略。
  
 
#### 示例
```
--创建存储过程。
gaussdb=# CREATE OR REPLACE PROCEDURE test_proc(a int)
IS
    proc_var int;
BEGIN
    proc_var := a;
END;
/
--修改存储过程的执行规则为IMMUTABLE,即参数不变时返回结果相同。
gaussdb=# ALTER PROCEDURE test_proc(a int) IMMUTABLE;
--新建用户。
gaussdb=# CREATE USER joe PASSWORD '********';
--修改存储过程的所有者。
gaussdb=# ALTER PROCEDURE test_proc(a int)  OWNER TO joe;
--新建模式。
gaussdb=# CREATE SCHEMA test;
--修改存储过程的所属模式。
gaussdb=# ALTER PROCEDURE  test_proc(a int)  SET SCHEMA test;
--删除存储过程,函数名需要指定所属模式。
gaussdb=# DROP PROCEDURE test.test_proc;
--删除新建的用户和模式。
gaussdb=# DROP USER joe;
gaussdb=# DROP SCHEMA test;
```
#### 相关链接
[CREATE PROCEDURE](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0261.html)，[DROP PROCEDURE](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0312.html)
