ALTER PROCEDURE 语句(外部程序)
ALTER PROCEDURE 语句用于更改当前服务器上外部存储过程的描述。
调用ALTER PROCEDURE(外部)
此语句可嵌入应用程序中或者以交互方式发出。 这是一个可执行语句,只有在DYNAMICRULES RUN行为生效时才能动态准备。 更多信息,请参阅授权ID和动态SQL。
ALTER PROCEDURE(外部)授权
以下定义的特权套装必须至少包含以下一项:
- 存储过程的所有权
- 架构上的ALTERIN权限
- SYSADM 或 SYSCTRL 权限
- 系统 DBADM
安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)
与模式名称匹配的授权ID隐式拥有该模式的ALTERIN权限。
如果用于更改过程的授权ID具有安装SYSADM权限或安装SYSOPR权限,并且当前SQLID设置为SYSINSTL,则在重新评估过程定义时,该过程将被识别为系统定义的过程。
什么时候 LANGUAGE 是 JAVA , 并且在 EXTERNAL NAME 子句中指定了jar名称,则权限集必须包括JAR文件(Java™归档文件)的USAGE。
权限设置:
如果语句嵌入到应用程序中,权限集就是软件包所有者所拥有的权限。
- 特权集包括系统管理员权限
- 特权集包括SYSCTRL权限
- 该进程的SQL授权ID具有对模式进行ALTERIN操作的权限
如果存储过程运行的环境发生变化,授权 ID 必须有权使用 WLM 环境。 此授权来自外部安全产品,例如 RACF®。更多信息,请参阅在WLM环境中管理创建存储过程的授权。
ALTER PROCEDURE(外部)的语法
选项列表 :(可任意选择选项。 请至少选择一项。 请不要重复选择同一选项。)
ALTER PROCEDURE(外部)描述
- 程序名
- 标识要更改的存储过程。
- DYNAMIC RESULT SETS 整数
- 指定存储过程可以返回的查询结果集的最大数量。 数值必须在0-32767之间。
- EXTERNAL NAME 外部程序名称或标识符
- 在 SQL CALL 语句中指定存储过程名称时,为程序指定 MVS 加载模块名称。
如果 LANGUAGE 是 JAVA,则必须指定外部程序名称 ,并将其放在单引号中,且单引号内不能有空格。 它必须指定一个有效的 external-java-routine-name。 如果指定了多个外部程序名称值,则所有值的总长度不得超过 1305 字节,且每个值之间必须用空格或换行符隔开。 不要为正在执行 NO SQL 正在生效。
外部Java程序名称包含以下部分:- 罐子名
- 标识JAR文件在数据库中安装时所取的名称。 名称包含 jar-id ,可选地使用模式限定。 例如: "myJar" 和 "mySchema.myJar。” 根据以下规则, 无限制的jar-id 将隐式地使用模式名称进行限定:
- 如果语句嵌入程序中,则方案名称为创建软件包或计划或上次重新绑定时 QUALIFIER 绑定选项中的授权ID。 如果未指定 QUALIFIER ,则架构名称为包或计划的所有者。
- 如果语句是动态准备的,则模式名称是当前模式特殊寄存器中的SQL授权ID。
如果指定了 jar-name ,则在处理ALTER PROCEDURE语句时,该jar-name必须存在。
如果未指定 jar-name ,则直接从类文件加载过程,而不是从JAR文件加载。 Db2 搜索与WLM环境关联的CLASSPATH目录。 Java例程的环境变量在JCL上的JAVAENV DD卡中指定,用于启动WLM管理的存储过程的地址空间。
- 方法名
- 标识方法名称,不得超过254字节。 它的包、类和方法ID是Java特有的,因此不限于18个字节。 此外,这些标识符所包含内容的规则与SQL普通标识符的规则并不一定相同。
- 包裹编号
- 识别一个包。 一系列包标识符确定了类标识符所属的包。 如果类属于某个包的一部分,则方法名称必须包含完整的包前缀,例如 "myPacks.StoredProcs Java虚拟机在 "/myPacks/StoredProcs/" 目录中查找类。
- 班级编号
- 标识Java对象的类标识符。
- 方法-ID
- 确定方法标识符与要调用的Java类。
- 方法签名
- 为参数列表确定一个零个或多个Java数据类型的列表,且不得超过1024字节。 如果过程涉及任何可以为空值的输入或输出参数,请指定方法签名。 当调用正在创建的存储过程时, Db2 搜索具有精确方法签名的 Java 方法。 指定的 Java数据类型元素的数量表示Java方法必须具有的参数数量。
Java程序不能有参数。 在这种情况下,您需要为方法签名编写一组空括号。 如果没有指定Java 方法签名 , Db2 将搜索一个Java方法,其签名来自与ALTER PROCEDURE语句参数列表中指定的SQL类型关联的默认 JDBC 类型。
对于 LANGUAGE,该值必须符合 MVS 载入模块的命名约定:该值必须小于或等于 8 字节,并且必须符合普通标识符的规则,但不得包含下划线。
- LANGUAGE
- 指定编写存储过程的编程语言。 汇编程序、C 语言、 COBOL 和 PL/I 程序必须设计为在 IBM® 的 Language Environment® 中运行。
- ASSEMBLE
- 存储过程是用汇编语言编写的。
- C
- 存储过程是用C或C++语言编写的。
- COBOL
- 存储过程是用 COBOL 编写的,包括 OO- COBOL 语言扩展。
- JAVA
- 存储过程是用Java编写的,在Java虚拟机中执行。 什么时候 LANGUAGE
JAVA 被指定, EXTERNAL NAME 子句还必须指定有效的 external-java-routine-name 和 PARAMETER
STYLE 必须指定 JAVA。 该过程必须是指定Java类的公共静态方法。
不要指定 LANGUAGE JAVA 什么时候 DBINFO, PROGRAM TYPE MAIN,或者 RUN OPTIONS 生效。
- PLI
- 存储过程是用 PL/I 编写的。
- REXX
- 存储过程是用REXX语言编写的。 不要指定 LANGUAGE REXX 当 PARAMETER STYLE SQL 时。
- PARAMETER STYLE
- 标识用于将参数传递给存储过程并从存储过程返回值的链接约定。 所有链接约定都会向存储过程提供参数,这些参数包含在CALL语句中指定的参数。 一些链接协议会将附加参数传递给存储过程,从而为存储过程提供更多信息。 有关链接约定的更多信息,请参阅外部存储过程的链接约定。
- SQL
- 指定除了CALL语句中的参数外,还将几个附加参数传递给存储过程。 传递以下参数:
- CREATE PROCEDURE语句中指定的前n个参数。
- n个参数 ,用于指示变量的参数。
- 要返回的SQLSTATE。
- 存储过程的限定名。
- 存储过程的特定名称。
- SQL诊断字符串将返回至 Db2。
- 如果 DBINFO 被指定,则 DBINFO 结构。
不要指定 PARAMETER STYLE SQL 当 LANGUAGE REXX 时。
- GENERAL
- 指定存储过程使用参数传递机制,其中存储过程仅接收CALL语句中指定的参数。 使用此参数样式定义的程序参数不能为空。
- GENERAL WITH NULLS
- 指定除了 GENERAL中指定的CALL语句参数外,另一个参数也会传递给存储过程。 附加参数包含一个指示数组,其中每个元素对应CALL语句中的每个参数。 在C语言中,这是一个短整数的数组。 指示器阵列使存储过程能够接受或返回空参数值。
- JAVA
- 指定存储过程使用的参数传递约定符合Java和SQLJ例程规范。 PARAMETER STYLE JAVA 仅当 LANGUAGEJAVA 。 如果ALTER PROCEDURE语句导致将 LANGUAGEJAVA ,则 PARAMETER
STYLE JAVA,则可能需要指定一个 EXTERNAL NAME 子句可能需要指定适当的值。 JAVA 必须指定 PARAMETER STYLE 当 LANGUAGEJAVA 。
INOUT 和 OUT 参数以单次输入数组的形式传递。 INOUT 和 OUT 参数在Java方法中声明为Java类型的单元素数组。
- DETERMINISTIC 或者 NOT DETERMINISTIC
- 指定存储过程是否在每次调用时返回相同的结果,且调用时使用的参数 IN 和 INOUT 参数调用时,存储过程是否每次都返回相同的结果。
- DETERMINISTIC
- 每次调用存储过程时,存储过程都会返回相同的结果,且 IN 和 INOUT 参数调用,则存储过程每次调用时都会返回相同的结果,前提是数据库中的引用数据没有发生变化。
- NOT DETERMINISTIC
- 每次调用存储过程时,存储过程可能不会返回相同的结果,因为 IN 和 INOUT 参数调用时,即使数据库中的引用数据没有变化,存储过程也可能不会返回相同的结果。
Db2 不验证存储过程代码是否符合 DETERMINISTIC 或 NOT DETERMINISTIC。
- NO PACKAGE PATH 或 PACKAGE PATH 包路径
- 标识运行程序时使用的包路径。 这是与该程序相关的DBRM可能包含的包集合列表。
- NO PACKAGE PATH
- 指定该过程的程序包集合列表与调用程序的程序包集合列表相同。 如果调用程序未使用包,则 Db2 会依次使用CURRENT PACKAGE PATH特殊寄存器、CURRENT PACKAGESET特殊寄存器或 PKLIST 绑定选项来解析包。 有关 Db2 如何使用这三项的信息,请参阅绑定申请计划。
- PACKAGE PATH 包路径
- 指定一个包集合列表,格式与当前包路径特殊寄存器中使用的格式相同。
如果 COLLID 条款中指定了 PACKAGE PATH,则 COLLID 在调用例程时忽略该子句。
当调用过程时,会检查与过程定义关联的包路径值。 如果包路径包含 SESSION_USER、USER、PATH 或 PACKAGE PATH,则在检查包路径值时返回错误。
- MODIFIES SQL DATA, READS SQL DATACONTAINS SQL或 NO SQL
- 指定此例程可以执行或调用的SQL语句和嵌套例程的分类。 数据库管理员负责验证由程序发出的SQL语句以及由程序在本地调用的所有例程是否符合本规范;当调用嵌套的远程例程时,不会进行验证。 有关每条语句的分类,请参阅例程的SQL语句数据访问分类。
- MODIFIES SQL DATA
- 指定该过程可以执行任何SQL语句,但不支持过程不支持的语句。
- READS SQL DATA
- 指定该过程可以执行带有数据访问指示的语句,包括读取SQL数据、包含SQL或非SQL。 该程序无法执行修改数据的SQL语句。
- CONTAINS SQL
- 指定该过程只能执行访问指示为CONTAINS SQL的SQL语句。 该程序无法执行读取或修改数据的语句。
- NO SQL
- 指定该过程只能执行数据访问分类为“非 SQL”的 SQL 语句。 不要 NO SQL 用于使用JAR文件的Java程序。
- NO DBINFO 或者 DBINFO
- 指定在调用存储过程时是否将附加状态信息传递给该存储过程。
- NO DBINFO
- 其他信息不会传递。
- DBINFO
- 当调用存储过程时,会传递另一个参数。 参数是一个包含应用程序运行时间授权ID、模式名称、过程可能插入或更新的表或列的名称以及调用过程的数据库服务器的标识等信息的数据结构。 有关参数及其结构的详细信息,请参阅 DBINFO结构。
DBINFO 仅当 PARAMETER STYLE SQL 被指定。
- NO COLLID 或 COLLID 收藏编号
- 标识执行存储过程时要使用的包集合。 这是与存储过程关联的DBRM绑定到其中的包集合。
- NO COLLID
- 指定存储过程的包集合与调用程序的包集合相同。 如果调用程序不使用包,则 Db2 会依次使用CURRENT PACKAGE PATH特殊寄存器、CURRENT PACKAGESET特殊寄存器或 PKLIST 绑定选项来解析包。 有关 Db2 如何使用这三项的详细信息,请参阅绑定应用计划中的打包分辨率信息。
- COLLID 收藏-ID
- 标识执行存储过程时要使用的包集合。 这是与存储过程关联的DBRM绑定到包集合的名称。
对于REXX存储过程 ,collection-id 可以是DSNREXRR、DSNREXRS、DSNREXCR或DSNREXCS。
- WLM ENVIRONMENT
- 当 Db2 存储过程地址空间由WLM建立时,标识存储过程在其中运行的工作负载管理器(WLM)环境。 WLM环境名称是一个SQL标识符。
- 名字
- 存储过程必须运行的WLM环境。 如果另一个存储过程或用户定义的函数调用存储过程,并且调用过程在未与指定的 WLM 环境关联的地址空间中运行,则 Db2 会将存储过程请求路由到不同的地址空间。
- (名字 ,*)
- 当存储过程被SQL应用程序直接调用时,存储过程运行所处的WLM环境。
如果另一个存储过程或用户定义的函数调用该存储过程,则该存储过程将在调用程序使用的相同WLM环境中运行。
您必须拥有WLM环境的相应权限。 管理WLM环境中创建存储过程的授权
- ASUTIME
- 以CPU服务单元为单位,指定存储过程每次调用可运行的处理器总时间。 该值与资源限制规格表中的ASUTIME列无关。
当您正在调试一个存储过程时,如果存储过程陷入循环,设置一个限制可能会有所帮助。 有关 CPU 服务单元的信息,请参阅 z/OS MVS Initialization and Tuning Guide。
- NO LIMIT
- 服务单位没有限制。
- LIMIT 整数
- 服务单元的限制是 1 至 2147483647 范围内的正整数。 如果存储过程使用的服务单元超过指定值, Db2 将取消存储过程。
- STAY RESIDENT
- 指定存储过程结束之后,存储过程加载模块是否保留在内存中。
- NO
- 存储过程结束后,加载模块将从内存中删除。 用于不可重入的存储过程。 NO 用于不可重入的存储过程。
- YES
- 存储过程结束后,负载模块仍保留在内存中。
- PROGRAM TYPE
- 指定存储过程是作为主例程还是子例程运行。 如果更改了程序类型,则需要重新编译存储过程,以便更改生效。
- SUB
- 存储过程作为子程序运行。
不要 PROGRAM TYPE SUB 存储过程,其 LANGUAGE 的存储过程。 REXX。
- MAIN
- 存储过程作为主程序运行。
不要指定 PROGRAM TYPE MAIN 当 LANGUAGE JAVA 时。
- SECURITY
- 指定存储过程如何与外部安全产品(如 RACF )交互,以控制对非SQL资源的访问。
- DB2
- 存储过程不需要特殊的外部安全环境。 如果存储过程访问外部安全产品保护的资源,则使用与存储过程地址空间关联的授权ID进行访问。
- USER
- 应为存储过程建立外部安全环境。 如果存储过程访问外部安全产品保护的资源,则使用调用存储过程的用户授权ID进行访问。
- DEFINER
- 应为存储过程建立外部安全环境。 如果存储过程访问外部安全产品所保护的资源,则使用存储过程所有者的授权ID进行访问。
- RUN OPTIONS 运行时选项
- 指定存储过程使用的 Language Environment 运行时选项。 对于 REXX 存储过程,指定 Language Environment 运行时选项,将其传递给 Db2 的 REXX 语言接口。 您必须将运行时选项指定为不超过 254 字节的字符串。 若要使用无选项替换任何现有的运行时间选项,请使用空字符串并 RUN OPTIONS。 如果指定的是空字符串, Db2 不会向 Language Environment 传递任何运行时选项,而 Language Environment 会使用其安装默认值。 有关 Language Environment 运行时选项的说明,请参阅 Language Environment Programming Reference。
不要指定 RUN OPTIONS 当 LANGUAGE JAVA 时。
- COMMIT ON RETURN
- 指示 Db2 是否要在从存储过程返回时立即提交事务。
- NO
- Db2 当存储过程返回时,不会发出提交。
- YES
- Db2 当存储过程返回时,如果以下语句为真,则发出提交:
- CALL语句返回的SQLCODE不是负数。
- 存储过程没有处于必须中止状态。
提交操作包括调用应用程序进程和存储过程执行的工作。
如果存储过程返回结果集,则与结果集关联的游标必须定义为“保持”,才能在提交后使用。
- INHERIT SPECIAL REGISTERS 或者 DEFAULT SPECIAL REGISTERS
- 指定在进入例程时如何设置特殊寄存器。
- INHERIT SPECIAL REGISTERS
- 表示特殊寄存器的值根据特殊寄存器表中列出的规则进行继承,该表位于存储过程、用户定义函数或存储过程的特殊寄存器中。
- DEFAULT SPECIAL REGISTERS
- 表示特殊寄存器被初始化为默认值,如特殊寄存器在用户定义函数或存储过程中的特性表中所示。
- CALLED ON NULL INPUT
- 指定即使参数值全部或部分为空,也要调用该过程,这意味着必须对参数值为空的情况进行测试。 该过程可能返回空值或非空值。
- STOP AFTER SYSTEM DEFAULT FAILURES, STOP AFTER nn FAILURES或 CONTINUE AFTER FAILURE
- 指定程序在出现一定次数的故障后是否进入停止状态。
- STOP AFTER SYSTEM DEFAULT FAILURES
- 指定在安装字段 DSNTIPX 中的 MAX ABEND COUNT 值指示的失败次数达到后,该例程应置于停止状态。
- STOP AFTER nn FAILURES
- 规定在发生nn次故障后,该程序应置于停止状态。 值nn 可以是1-32767之间的整数。
- CONTINUE AFTER FAILURE
- 规定在任何故障发生后,该程序不应处于停止状态。
- ALLOW DEBUG MODE、 DISALLOW DEBUG MODE或 DISABLE DEBUG MODE
- 指定程序是否可以在调试模式下运行。
除非程序定义为 LANGUAGE JAVA。
- ALLOW DEBUG MODE
- 指定该程序可在调试模式下运行。
- DISALLOW DEBUG MODE
- 指定该过程不能在调试模式下运行。
您可以使用后续的ALTER PROCEDURE语句将此选项更改为 ALLOW DEBUG MODE。
- DISABLE DEBUG MODE
- 指定该程序永远不能在调试模式下运行。
不能更改程序来指定 ALLOW DEBUG MODE 或 DISALLOW DEBUG MODE 创建或更改流程时,指定流程或 DISABLE DEBUG MODE。 要更改此选项,您必须使用所需的选项删除并重新创建程序。
ALTER PROCEDURE(外部)的备注
包无效 :当外部程序被修改时,所有引用该程序的包都会标记为无效。
LANGUAGE C 以及 条款:ALTER PROCEDURE语句 PARAMETER VARCHAR 不允许您更改 PARAMETER VARCHAR 或 PARAMETER CCSID 与程序定义相关的子句的值。 但是,您可以更改 LANGUAGE 条款。 如果 PARAMETER VARCHAR 子句用于创建 LANGUAGE C 存储过程,则该选项的目录信息不会受到后续 ALTER PROCEDURE 语句的影响。 程序可能会更改为C语言以外的其他语言,在这种情况下, PARAMETER VARCHAR 设置将被忽略。 如果稍后又将程序改回 LANGUAGE C,则将使用 PARAMETER VARCHAR 选项的设置(仍在目录中)将被使用。
备选语法和同义词 :为了与 Db2 的早期版本或 Db2 系列中的其他产品兼容, Db2 支持以下关键词:
- 动态结果集、结果集和结果集作为同义词 DYNAMIC RESULT SETS
- 标准呼叫(STANDARD CALL)作为 DB2SQL
- 简单通话是 GENERAL
- 用“零”来表示“简单”的同义词 GENERAL WITH NULLS
- VARIANT作为同义词 NOT DETERMINISTIC
- NOT VARIANT作为同义词 DETERMINISTIC
- NULL CALL作为同义词 CALLED ON NULL INPUT
- 参数 风格 DB2SQL 作为同义词 PARAMETER STYLE SQL
ALTER PROCEDURE(外部)示例
- 示例 1
- 假设存储过程 SYSPROC.MYPROC 当前被定义为在WLM环境PARTSA中运行,并且您拥有WLM环境PARTSA和WLM环境PARTSEC的相应权限。 更改存储过程的定义,使其能够在 PARTSEC 中运行。
ALTER PROCEDURE SYSPROC.MYPROC WLM ENVIRONMENT PARTSEC;
