ALTER PROCEDURE (SQL)
ALTER PROCEDURE (SQL) 语句将更改当前服务器上的过程。
调用
此语句可嵌入应用程序中或者以交互方式发出。 它是可以动态准备的可执行语句。
授权
此语句的授权标识所拥有的特权必须至少包括下列其中一项:
- 对于语句中确定的过程:
- 过程的 ALTER 特权,以及
- 对包含过程的模式的 USAGE 特权。
- 数据库管理员权限
如果在 parameter-statement中引用了单值类型,那么语句的授权标识所拥有的特权必须至少包含下列其中一项:
- 对于语句中标识的每个单值类型:
- 单值类型的 USAGE 特权,以及
- 对包含单值类型的模式的 USAGE 特权
- 管理权限
有关对应于 SQL 特权的系统权限的信息,请参阅 检查对功能或过程的特权时的对应系统权限 和 检查对单值类型的特权时的对应系统权限。
语法
描述
- 程序或特定程序
- 标识要更改的过程。 procedure-name 必须标识 当前服务器上存在的 SQL 过程。
指定的过程已变更。 将保留该过程的所有者以及该过程的所有特权。
- 程序名称
- 按过程名称标识过程。 procedure-name 必须正好标识一个 SQL 过程。 该过程可能具有为其定义的任意数目的参数。 如果在指定或隐式模式中存在多个指定名称的过程,那么将返回错误。
- PROCEDURE procedure-name (parameter-type , ...)
- 通过过程特征符来标识过程,该特征符唯一地标识过程。 procedure-name (parameter-type , ...) 必须标识具有指定过程特征符的 SQL 过程。 指定的参数必须与创建过程时指定的相应位置中的数据类型相匹配。 数据类型的数目和数据类型的逻辑并置用于标识要更改的特定过程实例。 数据类型的同义词被视为匹配。 具有缺省值的参数必须包含在此特征符中。
如果指定了 procedure-name () ,那么标识的过程必须具有零个参数。
- 程序名
- 标识过程的名称。
- (参数类型, ...)
- 标识过程的参数。
如果指定了未限定的单值类型或数组类型名称,那么数据库管理器将搜索 SQL 路径以解析单值类型或数组类型的模式名称。
对于具有长度,精度或小数位属性的数据类型,请使用下列其中一项:
- 空括号指示数据库管理器在确定数据类型是否匹配时忽略该属性。 例如, DEC () 将被视为与使用数据类型 DEC (7 2) 定义的过程的参数匹配。 但是,不能使用空括号指定 FLOAT ,因为其精度值指示特定数据类型 (REAL 或 DOUBLE)。
- 如果指定了长度,精度或小数位属性的特定值,那么该值必须与 CREATE PROCEDURE 语句中指定的值 (隐式或显式) 完全匹配。 如果数据类型为 FLOAT ,那么精度不必与指定的值完全匹配,因为匹配基于数据类型 (REAL 或 DOUBLE)。
- 如果未显式指定长度,精度或小数位,并且未指定空括号,那么将隐含数据类型的缺省属性。 隐式长度必须与 CREATE PROCEDURE 语句中指定的值 (隐式或显式) 完全匹配。
指定 FOR DATA 子句或 CCSID 子句是可选的。 省略任一子句指示数据库管理器在确定数据类型是否匹配时忽略该属性。 如果指定了任一子句,那么它必须与在 CREATE PROCEDURE 语句中隐式或显式指定的值匹配。
- AS 定位器
- 指定将该过程定义为接收此参数的定位器。 如果指定了 AS LOCATOR ,那么数据类型必须是 LOB 或基于 LOB 的单值类型。
- 特定过程 specific-name
- 按过程的特定名称来标识过程。 specific-name 必须标识当前服务器上存在的特定过程。
- ALTER 选项-list
- 指示要更改过程的一个或多个选项。 如果指定了 ALTER PROCEDURE ALTER option-list 并且未指定选项,那么将使用现有过程定义中的值。 请参阅 CREATE PROCEDURE (SQL) 以获取每个选项的描述。
- REPLACE 例程规范
- 指示现有过程定义 (包括选项和参数) 将替换为此语句中指定的过程定义。 替换过程时,将替换所有选项的值。 如果未指定选项,那么将使用与创建新 SQL 过程时相同的缺省值,有关更多信息,请参阅 CREATE PROCEDURE (SQL)。
如果例程具有注释或标签,那么将从例程定义中除去这些注释或标签。
- (parameter-声明, ...)
- 指定过程的参数数目,每个参数的数据类型以及每个参数的名称。 过程的参数可以仅用于输入,仅用于输出,也可以同时用于输入和输出。
SQL 过程中允许的最大参数数为 2000。
- IN
- 将参数标识为过程的输入参数。
- 输出
- 将参数标识为过程返回的输出参数。 如果未在过程中设置参数,那么将返回空值。
- INOUT
- 将参数标识为过程的输入和输出参数。 如果未在过程中设置参数,那么将返回其输入值。 如果使用缺省值定义了 INOUT 参数,并且在调用过程时使用了缺省值,那么不会返回该参数的值。
- 参数名称
- 命名要用作 SQL 变量的参数。 该名称不能与过程的任何其他 parameter-name 相同。
- 数据类型
- 指定参数的数据类型。 如果指定了 CCSID ,那么在将该参数传递到过程之前,该参数将转换为该 CCSID。 如果未指定 CCSID ,那么在调用过程时, CCSID 由当前服务器上的缺省 CCSID 确定。
- 默认条款
- 指定参数的缺省值。 缺省值可以是常量,专用寄存器,全局变量,表达式,
a search-condition,
或关键字 NULL。 表达式是 表达式中定义的不包含聚集函数或列名的任何表达式。
如果指定了 search-condition ,那么它不得在 EXISTS 或 IN 谓词中包含子查询。
如果未指定缺省值,那么该参数没有缺省值,并且不能在调用时省略。 表达式字符串的最大长度为 64K。缺省表达式不得修改 SQL 数据。 表达式必须是与参数数据类型兼容的赋值。 创建过程时,缺省表达式中引用的所有对象都必须存在。
缺省表达式中用作列表中数字常量的分隔符的任何逗号都必须后跟空格。
不能指定缺省值:- 对于 OUT 参数。
- 用于数组类型的参数。
- 选项-列表
- 要变更的过程的选项列表。 这些选项与以上在 ALTER option-list下列出的选项相同。 如果未指定特定选项,那么将使用创建新过程时使用的缺省值。 有关更多信息,请参阅 CREATE PROCEDURE (SQL)。
- SET OPTION-语句
- 指定将用于创建过程的选项。 例如,要创建可调试过程,可以包括以下语句:
有关更多信息,请参阅 SET OPTION。SET OPTION DBGVIEW = *SOURCE在 ALTER PROCEDURE 语句中不允许使用选项 CLOSQLCSR , CNULRQD , COMPILEOPT , NAMING 和 SQLCA。 处理缺省值表达式时使用以下选项 :ALWCPYDTA , CONACC , DATFMT , DATSEP , DECFLTRND ,DECMP, DECRESULT , DFTRDBCOL , LANGID , SQLCURRULE , SQLPATH , SRTSEQ , TGTRLS , TIMFMT 和 TIMSEP。
- SQL 例程主体
- 指定单个 SQL 语句,包括复合语句。 有关定义 SQL 过程的更多信息,请参阅 SQL 控制语句 。
在远程应用程序服务器上运行的过程中不允许 CONNECT , SET CONNECTION , RELEASE , DISCONNECT 和 SET TRANSACTION 语句。 不允许 COMMIT 和 ROLLBACK 语句出现在 ATatomic SQL 过程中或在与远程应用程序服务器的连接上运行的过程中。
ALTER PROCEDURE (SQL) , ALTER FUNCTION (SQL 标量) 和带有 REPLACE 关键字的 ALTER FUNCTION (SQL 表) 在 SQL-routine-body中是不允许的。
注意
定义或替换过程的一般注意事项: 请参阅 CREATE PROCEDURE 以获取有关定义过程的一般信息。 ALTER PROCEDURE (SQL) 允许更改个别属性或例程规范,同时保留对该过程的特权。
除去 RESTRICT ON DROP 属性: 如果执行 ALTER PROCEDURE 语句时缺省表达式中引用的任何对象不存在,那么 ALTER 将失败。 使用带有 OR REPLACE 子句的 CREATE PROCEDURE 语句来创建没有缺少对象引用的过程。 可以在此 CREATE PROCEDURE 语句或后续 ALTER PROCEDURE 语句中包含 WITHOUT RESTRICT ON DROP 子句。
变更过程替换注意事项: 当替换 SQL 过程定义时, SQL 将创建一个临时源文件,该文件将包含带有嵌入式 SQL 语句的 C 源代码。 然后使用 CRTPGM 命令创建程序对象。 用于创建程序的 SQL 选项是在执行 ALTER PROCEDURE (SQL) 语句时生效的选项。 使用 ACTGRP (*CALLER) 创建程序。
当改变 SQL 过程时,将创建新的 *PGM 或 *SRVPGM 对象,并将该过程的属性存储在创建的程序对象中。 如果保存了 *PGM 或 *SRVPGM 对象,然后将其恢复到此系统或其他系统,那么将使用这些属性自动更新目录。
特定名称用作源文件中成员的名称以及程序对象的名称 (如果它是有效的系统名称)。 如果过程名称不是有效的系统名称,那么将生成唯一名称。 如果已存在具有相同名称的源文件成员,那么将覆盖该成员。 如果已存在具有相同名称的模块或程序,那么不会覆盖对象,并且会生成唯一名称。 根据生成系统表名的规则生成唯一名称。
目标发行版注意事项: 当替换 SQL 过程定义时,除非用户显式指定其他目标发行版,否则目标发行版将是执行 ALTER 语句的当前发行版。 可以使用 SET OPTION 语句中的 TGTRLS 关键字显式指定目标发行版。 如果在 RUNSQLSTM 或 CRTSQLxxx 命令的源中指定了 ALTER ,那么也可以在该命令上指定 TGTRLS 关键字。
如果未替换过程定义,那么将保留现有过程的目标发行版,除非该过程的目标发行版级别低于受支持的最早发行版级别。 在这种情况下,目标发行版将更改为受支持的最早发行版级别。
模糊语句: 可以变更使用模糊语句创建的过程。 更改语句时,将修改保存在目录中的语句的编码版本,并且可能会超过 SQL 语句的最大长度。 如果发生此情况,那么将发出错误,并且变更将失败。
语法替代方法: 以下关键字是支持与先前发行版兼容的同义词。 这些关键字是非标准的,不应使用:
- 关键字 VARIANT 和 NOT VARIANT 可用作 NOT 确定性和确定性的同义词。
- 关键字 NULL CALL 可用作 CALL ON NULL INPUT 的同义词。
- DYNAMIC RESULT SET , RESULT SETS 和 RESULT SET 可用作 DYNAMIC RESULT SETS 的同义词。
示例
修改 SQL 过程的定义,以便在从 SQL 过程返回时落实 SQL 更改。
ALTER PROCEDURE UPDATE_SALARY_2
ALTER COMMIT ON RETURN YES