CREATE PROCEDURE 语句(SQL - 外部程序)(已弃用)

CREATE PROCEDURE 语句用于在当前服务器上定义外部 SQL 过程,并指定过程的源语句。 这是 DB2® 9 之前的 Db2 版本中唯一可用的SQL程序类型。

Deprecated function : 更改开始外部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程序名 (,parameter-declaration)option-listSQL 常规语句主体

参数声明:

阅读语法图跳过可视化语法图 INOUTINOUT parameter-name 参数类型

参数类型:

阅读语法图跳过可视化语法图built-in-typeTABLE LIKEtable-nameAS LOCATOR

内置类型:

阅读语法图跳过可视化语法图SMALLINTINTEGERINTDECIMALDECNUMERIC(5,0)( 整数整数)FLOAT(53)( 整数)REALDOUBLEPRECISIONCHARACTERCHAR(1)( 整数)CHARACTERCHARVARYINGVARCHAR( 整数)CCSIDASCIIEBCDICUNICODEFORSBCSMIXEDBITDATACHARACTERCHARLARGE OBJECTCLOB(1M)( 整数KMG)CCSIDASCIIEBCDICUNICODEFORSBCSMIXEDDATAGRAPHIC(1)( 整数)VARGRAPHIC(整数)DBCLOB(1M)( 整数KMG)CCSIDASCIIEBCDICUNICODEBINARY LARGE OBJECTBLOB(1M)( 整数KMG)DATETIMETIMESTAMP

选项列表 :(选项可以任意排序,但每个选项只能出现一次)

阅读语法图跳过可视化语法图LANGUAGE SQLFENCED1EXTERNAL NAME' 字符串'标识1DYNAMIC RESULT SETS 0DYNAMIC RESULT SETS整数PARAMETER CCSIDASCIIEBCDICUNICODEPARAMETER VARCHARNULTERMSTRUCTURENOT DETERMINISTICDETERMINISTICCALLED ON NULL INPUT MODIFIES SQL DATAREADS SQL DATACONTAINS SQLNO DBINFONO COLLIDCOLLID收藏-IDWLM ENVIRONMENT名称(名称,*)ASUTIME NO LIMITASUTIME LIMIT整数STAY RESIDENT NOSTAY RESIDENT YESPROGRAM TYPE MAINPROGRAM TYPE SUBSECURITY DB2SECURITY USERSECURITY DEFINERRUN OPTIONS运行时选项COMMIT ON RETURN NOCOMMIT ON RETURN YESINHERIT SPECIAL REGISTERSDEFAULT SPECIAL REGISTERSSTOP AFTER SYSTEM DEFAULT FAILURESSTOP AFTER整数FAILURESCONTINUE AFTER FAILURE
注意:
  • 1 必须指定 FENCED 或 EXTERNAL NAME 子句,以表明定义是针对外部 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,以便在落实后可用。

继承特殊注册默认特殊注册
指定在进入例程时如何设置特殊寄存器。
INHERIT SPECIAL REGISTERS
根据表 1 程序中特殊寄存器特性表中列出的规则,指定继承特殊寄存器的值。

默认设置是“INHERIT SPECIAL REGISTERS”。

默认特殊注册
指定将特殊寄存器初始化为默认值, 如表 1 程序中特殊寄存器特性表中的规则所示。
系统默认故障后停止、 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 控制语句