CREATE PROCEDURE 语句(SQL - 外部程序)(已弃用)
CREATE PROCEDURE 语句用于在当前服务器上定义外部 SQL 过程,并指定过程的源语句。 这是 DB2® 9 之前的 Db2 版本中唯一可用的SQL程序类型。
外部SQL程序已过时,且无法像本地SQL程序那样获得全面支持。 为了获得最佳效果,请创建本机SQL程序。 更多信息,请参阅创建本机SQL程序和将外部SQL程序迁移为本机SQL程序。
有关外部SQL程序中支持的SQL控制语句的信息,请参阅外部SQL程序的SQL控制语句。
CREATE PROCEDURE(SQL - 外部)调用
此语句只能动态编写,但必须以隐式或显式方式指定DYNAMICRULES运行行为。 它打算使用以下方法之一进行处理:
- JCL
- Db2 for z/OS® SQL 过程处理器(DSNTPSMP)(IBM® Optim Development Studio 使用此方法)
从其他上下文发出CREATE PROCEDURE语句将导致不完整的程序定义,即使语句处理返回时没有错误。 有关准备SQL程序执行的更多信息,请参阅创建外部SQL程序(已弃用 )。
CREATE PROCEDURE(SQL - 外部)授权
以下定义的特权套装必须至少包含以下一项:
- 模式中的CREATEIN特权
- SYSADM 或 SYSCTRL 权限
- 系统 DBADM
安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)
与模式名称匹配的授权ID隐式拥有该模式的CREATEIN权限。
如果用于创建过程的授权ID具有安装SYSADM权限或安装SYSOPR权限,并且当前SQLID设置为SYSINSTL,则该过程将被识别为系统定义的过程。
权限设置:
如果语句嵌入到应用程序中,权限集就是计划或软件包所有者所拥有的权限。 如果所有者是一个角色,则隐式模式匹配不适用,该角色需要包含前面列出的条件之一。
如果语句动态生成,且未在指定了 ROLE AS OBJECT OWNER 子句的可信环境中运行,则权限集是指进程的 SQL 授权 ID 持有的权限集。 如果架构名称与进程的SQL授权ID不同,则必须满足以下条件之一:
- 特权集包括SYSADM或SYSCTRL权限。
- 该进程的SQL授权ID对模式具有CREATEIN权限。
用于创建存储过程的授权ID必须有权限创建要在指定的WLM环境中运行的程序。
存储过程的拥有者由CREATE PROCEDURE语句的调用方式决定:
- 如果语句嵌入程序中,则所有者是计划或软件包所有者的授权ID。
- 如果语句是动态准备的,则所有者是当前 SQLID 特殊寄存器中的 SQL 授权 ID。
通过GRANT选项,所有者被隐式授予执行权限。
CREATE PROCEDURE(SQL - 外部)的语法
参数声明:
参数类型:
内置类型:
选项列表 :(选项可以任意排序,但每个选项只能出现一次)
CREATE PROCEDURE(SQL - 外部)描述
- 程序名
命名程序。 该名称(包括隐式或显式限定符)不得标识当前服务器上已存在的存储过程。

模式名称不能以 "SYS "开头,除非它是以下名称之一:"SYSADM"、"SYSIBM"、"SYSIBMADM"、"SYSPROC "或 "SYSTOOLS"。
使用 "SYSIBMADM "或 "SYSTOOLS "模式需要 SYSADM 或 SYSCTRL 授权。

- (参数声明 ……)
- 指定过程的参数数量、每个参数的数据类型以及每个参数的名称。 一个过程的参数只能用于输入、只能用于输出或同时用于输入和输出。 如果程序返回错误,则OUT参数未定义,INOUT参数保持不变。 所有参数均为可选。
- IN
- 识别作为过程输入参数的参数。 在进入程序时,参数的值是返回给调用SQL应用程序的值,即使程序中对该参数进行了更改。
IN 是缺省方式。
- OUT
- 将参数标识为过程返回的输出参数。 如果未在程序中设置参数,则返回空值。
- INOUT
- 识别作为过程输入输出参数的参数。 如果参数未在程序中设置,则返回其输入值。
- 参数名称
- 指定用作SQL变量的参数。 参数名称是SQL标识符,不能是包含小写字母或特殊字符的分隔标识符。 参数名称不能与该版本程序的任何其他参数名称相同。
- 参数类型
- 指定参数的数据类型。
- 内置式
- 参数的数据类型是内置数据类型。
有关数据类型的更多信息,包括字符数据类型的子类型(FOR子类型DATA 子句),请参阅内置类型。 对于外部SQL程序,VARCHAR的最大限制为32767,VARGRAPHIC的最大限制为16382。
对于字符或图形数据类型的参数,PARAMETER CCSID子句或CCSID子句指示参数的编码方案。 如果您没有指定这两个条款中的任何一个,编码方案就是安装面板 DSNTIPF 上的字段 DEF ENCODING SCHEME 的值。
虽然字符数据类型的输入参数具有隐式或显式指定的子类型(BIT、SBCS或MIXED),但实际传入输入参数的值可以具有任何子类型。 因此,在调用过程时,输入数据可能会转换为参数的子类型。 在使用ASCII或EBCDIC时,如果将实际包含DBCS字符的混合数据用作以SBCS子类型声明的输入参数的值,则会发生错误。
日期时间数据类型的参数以字符数据类型的形式传递给SQL过程,数据以ISO格式传递。
日期时间类型参数的编码方案确定如下:
- 如果有一个或多个参数具有字符或图形数据类型,则日期时间类型参数的编码方案与字符或图形参数的编码方案相同。
- 否则,编码方案为安装面板DSNTIPF上DEF ENCODING SCHEME字段的值。
- TABLE LIKE 表名作为定位器
- 指定参数为转换表。 然而,当调用该过程时,转换表中的实际值不会传递给该过程。 而是传递一个单一的值。 这个单一值是表的定位符,程序通过它来访问转换表的列。 带表参数的流程只能从触发器的触发操作中调用。
转换表包含定义为隐式隐藏的列。 已标识的表可以包含XML列,但该过程不能引用这些XML列。
有关 TABLE LIKE 子句的更多信息,请参阅 TABLE LIKE。 有关使用表格定位器的更多信息,请参阅在用户定义的函数或存储过程中访问转换表。
- 中文
- 指定编写程序的编程语言。
- SQL
- 该程序是用 Db2 SQL程序语言编写的。
- FENCED
- 指定该过程在外部地址空间中运行。 FENCED 还规定,SQL 存储过程程序是 MVS 加载模块,具有外部名称。
- 动态结果集 整数
- 指定程序可以返回的查询结果集的最大数量。 默认值为动态结果集 0,表示该过程可能不返回结果集。 整数值必须在0-32767之间。
- PARAMETER CCSID
- 指示字符和图形字符串参数的编码方案是ASCII、EBCDIC还是UNICODE。 默认编码方案是指在参数列表的CCSID子句中或在安装面板DSNTIPF的编码方案字段中指定的值。
该条款为指定字符和图形字符串参数的编码方案提供了便利。 如果除了此 PARAMETER CCSID 子句之外,还为各个参数指定了各个 CCSID 子句,那么在所有 CCSID 子句中指定的值必须与此子句中指定的值相同。
该条款还规定了系统生成的常规参数(如消息标记和DBINFO)所使用的编码方案。
- 参数 VARCHAR
- 指定了LANGUAGE C程序中不同长度字符串参数的值的表示形式。
- 无效
- 指定可变长度字符串参数以NUL字符结尾的字符串形式表示。
NULTERM是默认值。
- 结构
- 指定可变长度字符串参数以VARCHAR结构形式表示。
参数VARCHAR子句仅适用于存储过程参数列表和RETURNS子句中的参数。 它不适用于系统生成的常规参数,例如消息标记和DBINFO。
在数据共享环境中,除非数据共享组的所有成员都支持参数VARCHAR子句,否则不应指定该子句。 如果某些组成员支持此条款,而其他成员不支持,并且指定了参数 VARCHAR,则根据调用例程的组成员的不同,例程将遇到不同的参数形式。
- 外部名称 “字符串 ” 或 标识符
- 在 SQL CALL 语句中指定存储过程名称时,为程序指定 MVS 加载模块名称。 该值必须符合 MVS 载入模块的命名约定:该值必须小于或等于 8 字节,必须符合普通标识符的规则,但不得包含下划线。
外部名称 默认名称为“程序名称 ”。 在某些情况下,默认名称可能无效。 为避免无效名称,请为长度超过 8 字节、包含下划线或不符合普通标识符规则的程序指定外部名称。
- 非确定性或确定性
- 指定每次调用具有相同输入和输出参数的程序时,程序是否返回相同的结果。
- NOT DETERMINISTIC
- 即使数据库中的引用数据没有变化,每次调用该过程并使用相同的IN和INOUT参数时,结果可能不同。
默认值为“非确定性”。
- DETERMINISTIC
- 如果数据库中的引用数据没有变化,那么每次调用存储过程时,如果输入和输出参数相同,那么存储过程总是返回相同的结果。
Db2 不验证程序代码是否符合确定性或非确定性的规范。
- CALLED ON NULL INPUT
- 指定即使任何或所有参数值为空,也要调用该过程,这意味着必须对过程进行编码,以测试参数值是否为空。 该过程可能返回空值或非空值。
默认值为“调用空输入”。
- 修改 SQL 数据、读取 SQL 数据或包含 SQL
- 指定此例程可以执行或调用的SQL语句和嵌套例程的分类。 数据库管理员负责验证由程序发出的SQL语句以及由程序在本地调用的所有例程是否符合规范;当调用嵌套的远程例程时,不会进行验证。 有关各语句的分类,请参阅例程的 SQL 语句数据访问分类。
- MODIFIES SQL DATA
- 指定该过程可以执行任何SQL语句,但不支持过程不支持的语句。
默认值为“修改 SQL 数据”。
- READS SQL DATA
- 指定该过程可以执行带有数据访问指示的语句,该指示为读取SQL数据或包含SQL。 该程序无法执行修改数据的SQL语句。
- CONTAINS SQL
- 指定该过程只能执行数据访问指示为CONTAINS SQL的SQL语句。 该程序无法执行读取或修改数据的语句。
- NO DBINFO
- 指定在调用该过程时,不会将 Db2 已知的任何其他状态信息传递给该过程。
- NO COLLID 或 COLLID 集合 ID
- 标识执行程序时使用的程序包集合。 这是与程序相关的DBRM绑定到其中的包集合。
- NO COLLID
- 指定该过程的程序包集合与调用程序的程序包集合相同。 如果调用程序不使用包,则 Db2 会依次使用CURRENT PACKAGE PATH特殊寄存器、CURRENT PACKAGESET特殊寄存器或PKLIST绑定选项来解析包。 有关 Db2 如何使用这三项的详细信息,请参阅绑定应用计划中的打包分辨率信息。
默认值为“不碰撞”。
- COLLID collection-id
- 指定程序的包集合。
- WLM ENVIRONMENT 名称 或 (名称 ,*)
- 当 Db2 存储过程地址空间由WLM建立时,标识存储过程在其中运行的工作负载管理器(WLM)环境。 WLM环境名称是一个SQL标识符。
如果您没有指定WLM环境,则程序将在安装时指定的WLM默认存储过程地址空间中运行。
- 名称
- 该程序必须运行的WLM环境。 如果另一个过程或用户定义的函数调用该过程,并且该调用例程正在与指定的WLM环境无关的地址空间中运行,则 Db2 会将过程请求路由到不同的地址空间。
- (名字,*)
- 当SQL应用程序直接调用一个过程时 ,name 指定了运行该过程的WLM环境。
如果另一个过程或用户定义的函数调用存储过程,则该过程将在调用程序使用的相同WLM环境中运行。
您必须拥有WLM环境的相应权限。
- ASUTIME
- 以CPU服务单元为单位,指定单个过程调用可以运行的处理器总时间。 该值与资源限制规格表的 ASUTIME 列无关。
当您调试一个程序时,如果程序陷入循环,设置一个限制可能会有所帮助。 有关服务单元的信息,请参阅 z/OS MVS Initialization and Tuning Guide。
- 无限制
- 该程序可以运行的CPU服务单元数量没有限制。
默认值为“无限制”。
- 极限整数
- CPU服务单元的数量限制为1-2147483647之间的正整数。 如果程序使用的服务单元数量超过指定值, Db2 将取消该程序。 在程序中,并行任务所消耗的CPU周期不计入指定的ASUTIME LIMIT。
- STAY RESIDENT
- 指定当程序结束时,用于该程序的加载模块是否仍驻留在内存中。
- 否
- 程序结束后,负载模块将从内存中删除。
NO 是缺省值。
- YES
- 在程序结束后,负载模块仍保留在内存中。
- PROGRAM TYPE
- 指定程序是以主例程还是子例程的形式运行。
- MAIN
- 该程序作为主程序运行。
默认值为MAIN。
- SUB
- 该过程作为子程序运行。
- 安全
- 指定程序与外部安全产品(如 RACF® )的交互方式,以控制对非SQL资源的访问。
- Db2
- 该程序不需要特殊的外部安全环境。 如果程序访问外部安全产品保护的资源,则使用与运行该程序的地址空间关联的授权ID进行访问。
Db2 是缺省值。
- 用户
- 应为该程序建立外部安全环境。 如果程序访问外部安全产品保护的资源,则使用调用该程序的用户授权ID进行访问。
- 定义者
- 应为该程序建立外部安全环境。 如果程序访问外部安全产品所保护的资源,则使用程序所有者的授权ID进行访问。
- 运行选项 run-time-options
- 指定用于存储过程的 Language Environment® 运行时选项。 您必须将运行时选项指定为不超过 254 字节的字符串。 如果不指定 RUN OPTIONS 或传递空字符串, Db2 不会向 Language Environment 传递任何运行时选项, Language Environment 会使用其安装默认值。
有关 Language Environment 运行时选项的说明,请参阅 Language Environment Programming Reference。
- COMMIT ON RETURN
- 指示 Db2 是否在程序返回时立即提交交易。
- 否
- Db2 当程序返回时,不会发出提交。
NO 是缺省值。
- YES
- Db2 当程序返回时,如果以下语句为真,则发出提交:
- CALL语句返回正SQLCODE。
- 程序没有处于必须中止的状态。
落实操作包括由调用应用程序进程和该过程执行的工作。
如果该过程返回结果集,那么与结果集相关联的游标必须已定义为 WITH HOLD,以便在落实后可用。
- 继承特殊注册或默认特殊注册
- 指定在进入例程时如何设置特殊寄存器。
- 系统默认故障后停止、 nn次故障后停止或故障后继续
- 指定程序在出现故障后停止。
- 系统默认故障后停止
- 指定在安装面板 DSNTIPX 上,当出现 MAX ABEND COUNT 字段值所指示的故障次数时,应将此例程置于停止状态。
系统默认故障后停止是默认设置。
- 在nn次失败后停止
- 规定在发生nn次故障后,该程序应置于停止状态。 值nn 可以是1-32767之间的整数。
- 失败后继续
- 规定在任何故障发生后,该程序不应处于停止状态。
- SQL 常规语句主体
- 指定定义SQL过程主体的语句。 有关外部 SQL 存储过程支持的 SQL 控制语句的信息,请参阅外部 SQL 存储过程的 SQL 控制语句。
CREATE PROCEDURE(SQL - 外部)的注释
- 各类手术注意事项
- 有关适用于所有类型过程的注意事项,请参阅 CREATE PROCEDURE语句(概述 )。
- 其他语法和同义词
- 为了与 Db2 的早期版本或 Db2 系列中的其他产品兼容, Db2 支持以下替代语法:
- 结果集和结果集作为动态结果集的同义词
- VARIANT作为“非确定性”的同义词
- NOT VARIANT 并非“确定性”的同义词
CREATE PROCEDURE(SQL - 外部)示例
- 示例 1
- 创建SQL过程的定义。 该程序接受员工编号和加薪倍数作为输入。 在程序主体中执行以下任务:
- 计算员工的新工资。
- 用新的工资值更新员工表。
CREATE PROCEDURE UPDATESALARY (IN EMPLOYEE_NUMBER CHAR(10), IN RATE DECIMAL(6,2)) LANGUAGE SQL FENCED EXTERNAL NAME 'USALARY1' MODIFIES SQL DATA UPDATE EMP SET SALARY = SALARY * RATE WHERE EMPNO = EMPLOYEE_NUMBER - 示例 2
为示例1中描述的SQL过程创建定义,但指定该过程具有以下特征:
- 该程序在名为PARTSA的WLM环境中运行。
- 同样的输入总是产生同样的输出。
- SQL工作将在返回给调用者时完成。
- 执行 SQL 存储过程时要使用的 Language Environment 运行时选项是 "MSGFILE(OUTFILE),RPTSTG(ON),RPTOPTS(ON)"。
CREATE PROCEDURE UPDATESALARY (IN EMPLOYEE_NUMBER CHAR(10), IN RATE DECIMAL(6,2)) LANGUAGE SQL FENCED EXTERNAL NAME 'USALARY2' MODIFIES SQL DATA WLM ENVIRONMENT PARTSA DETERMINISTIC RUN OPTIONS 'MSGFILE(OUTFILE),RPTSTG(ON),RPTOPTS(ON)' COMMIT ON RETURN YES UPDATE EMP SET SALARY = SALARY * RATE WHERE EMPNO = EMPLOYEE_NUMBER
有关 SQL 程序的更多示例,请参阅外部 SQL 程序的 SQL 控制语句。
