CREATE PROCEDURE 语句(外部程序)
CREATE PROCEDURE 语句用于定义当前服务器上的外部存储过程。
CREATE PROCEDURE(外部)调用
此语句可嵌入应用程序中或者以交互方式发出。 这是一个可执行语句,只有在DYNAMICRULES RUN行为生效时才能动态准备。 更多信息,请参阅授权ID和动态SQL。
CREATE PROCEDURE(外部)授权
要在隐式或显式模式中创建新程序,下面定义的权限集必须至少包含以下一项:
- 模式中的CREATEIN特权
- SYSADM 或 SYSCTRL 权限
- 系统 DBADM
安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)
与模式名称匹配的授权ID隐式拥有该模式的CREATEIN权限。
- 程序的所有权
- 架构上的DROPIN和CREATEIN特权
- 系统 DBADM 权限
- SYSCTRL 权限
- SYSADM 权限
- 安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)
如果用于创建过程的授权ID具有安装SYSADM权限或安装SYSOPR权限,并且当前SQLID设置为SYSINSTL,则该过程将被识别为系统定义的过程。
当语言为JAVA且在外部名称子句中指定了 JAR名称时,权限集必须包括对JAR文件(Java™归档文件)的使用权限。
权限设置:
如果语句嵌入到应用程序中,权限集就是计划或软件包所有者所拥有的权限。 如果所有者是一个角色,则隐式模式匹配不适用,该角色需要包含前面列出的条件之一。
如果语句动态生成,且未在指定了 ROLE AS OBJECT OWNER 子句的可信环境中运行,则权限集是指进程的 SQL 授权 ID 所拥有的权限集。 如果架构名称与进程的SQL授权ID不同,则必须满足以下条件之一:
- 特权集包括SYSADM或SYSCTRL权限。
- 该进程的SQL授权ID对模式具有CREATEIN权限。
用于创建存储过程的授权ID必须有权限定义在指定的WLM环境中运行的程序。 更多信息,请参阅 《WLM环境中创建存储过程的授权管理 》。
此外,如果存储过程使用用户定义的类型作为参数,则此授权ID必须对定义为用户定义类型的每个参数具有USAGE权限。
CREATE PROCEDURE(外部)的语法
参数声明:
参数类型:
数据类型:
内置类型:
选项列表 :(选项可以以任何顺序指定。)
CREATE PROCEDURE(外部)描述
OR REPLACE
FL 507规定, 如果当前服务器上存在存储过程,则替换现有定义。 如果当前服务器上不存在过程定义,那么将忽略此选项。 如果存在具有指定名称的程序,则现有程序必须为外部程序。如果存在该程序,则将其替换。 在目录中替换新定义之前,先删除现有定义,但根据程序授予的特权不受影响。 该过程可重新创建如下:- 任何现有评论将被删除
- 程序定义可以更改
- 与程序定义相关的时间戳被更新
- 程序的所有者可以更改
- 对于未明确指定的选项,将使用系统默认值,即使这些选项在最初定义被替换的过程时已明确指定
要替换现有程序,必须满足以下条件之一:- 特定条款必须与程序名称一起指定
- 新程序定义的签名必须与现有程序定义的签名一致,参数名称除外

- 程序名
命名存储过程。 除非指定 OR REPLACE 子句,否则名称(包括隐式或显式限定符)不得标识当前服务器上的现有存储过程。
名称不能是单个星号,即使您将其指定为分隔符(“*”)。

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

- (参数声明……)
- 指定存储过程的参数数量和每个参数的数据类型,以及每个参数的可选名称。 存储过程的参数只能用于输入、只能用于输出或同时用于输入和输出。 如果该过程返回错误,那么 OUT 参数未定义,INOUT 参数则保持不变。
除了Java程序中的数字参数外,所有参数都是可空参数,其中DECIMAL类型以外的数字参数不能为空,以符合SQL/JRT标准。
- IN
- 识别作为过程输入参数的参数。 在进入程序时,参数的值是返回给调用SQL应用程序的值,即使程序中对该参数进行了更改。
IN 是缺省方式。
- OUT
- 将参数标识为存储过程返回的输出参数。
- INOUT
- 将参数标识为存储过程的输入和输出参数。
- 参数名称
- 指定用作SQL变量的参数。 名称不能与该过程的任何其他参数名称相同。
- data-type
- 指定参数的数据类型。 数据类型可以是内置数据类型,也可以是用户自定义类型。
如果您指定了用户定义类型的名称而没有模式名称, Db2 将通过在SQL路径中搜索模式来解析用户定义类型。
- 内置式
- 参数的数据类型是内置数据类型。
有关数据类型的更多信息,请参阅内置类型。
对于字符或图形数据类型的参数,PARAMETER CCSID子句或CCSID子句指示参数的编码方案。 如果您没有指定这两个条款中的任何一个,编码方案就是安装面板 DSNTIPF 上的字段 DEF ENCODING SCHEME 的值。
- distinct-type-name
- 输入参数的数据类型是不同的类型。 参数的任何长度、精度、比例、子类型或编码方案属性都是不同类型的源类型的属性。
虽然字符数据类型的输入参数具有隐式或显式指定的子类型(BIT、SBCS或MIXED),但CALL语句中输入参数实际传递的值可以具有任何子类型。 因此,在调用该过程时,可能会将输入数据转换为参数的子类型。 在使用ASCII或EBCDIC时,如果将实际包含DBCS字符的混合数据用作以SBCS子类型声明的输入参数的值,则会发生错误。
日期时间数据类型或不同类型的参数将以不同数据类型的形式传递给函数:
- 日期时间类型参数以字符数据类型传递,数据以ISO格式传递。
日期时间类型参数的编码方案与任何字符或图形字符串参数的隐式或显式编码方案相同。 如果没有传递字符串或图形字符串参数,则编码方案为安装面板 DSNTIPF 上的字段 DEF ENCODING SCHEME 的值。
- 一个不同的类型参数作为不同类型的源类型传递。
- AS LOCATOR
- 指定将参数值的定位器传递给过程,而不是实际值。 仅对具有LOB数据类型或基于LOB数据类型的独特类型的参数指定AS LOCATOR。 传递定位符而不是值可以减少传递给过程的字节数,特别是当参数值非常大时。
AS LOCATOR子句对确定数据类型是否可以提升没有影响。
- TABLE LIKE 表名或视图名 AS LOCATOR
- 指定参数为转换表。 但是,当调用存储过程时,转换表中的实际值不会传递给存储过程。 而是传递一个单一的值。 这个单一值是表的定位符,程序通过它来访问转换表的列。 带表参数的流程只能从触发器的触发操作中调用。
使用 TABLE LIKE 隐式定义了转换表。 它规定转换表的列数与已识别表或视图的列数相同。 如果指定了表格,则转换表格中包含定义为隐式隐藏的列。 列具有与已识别表或视图相同的数据类型、长度、精度、比例、子类型和编码方案,如目录表 SYSCOLUMNS 和 SYSTABLESPACES 中所述。 列的数量和属性在处理CREATE PROCEDURE语句时确定。 随后对表格中列的数量或列的属性所做的任何更改都不会影响程序的参数。
表名或视图名必须标识当前服务器上存在的表或视图。 名称不得用于标识已声明的临时表。 已标识的表可以包含XML列,但该过程不能引用这些XML列。 名称不必与触发器转换表关联的表名称相同。 根据以下规则,未限定的表名或视图名将被隐式限定:
- 如果CREATE PROCEDURE语句嵌入在程序中,则隐式限定符是创建计划或包时或上次重新编译时QUALIFIER绑定选项中的授权ID。 如果没有使用限定词,则隐含限定词为计划或套餐的所有者。
- 如果CREATE PROCEDURE语句是动态准备的,则隐式限定符是CURRENT SCHEMA特殊寄存器中的SQL授权ID。
当调用该过程时,由表定位符标识的转换表的相应列与TABLE LIKE子句中标识的表或视图必须具有相同的定义。 这些列的数据类型、长度、精度、比例和编码方案必须完全匹配。 使用CREATE PROCEDURE语句执行时对表或视图的描述。
此外,如果定义时指定的表参数的对应列未定义为字符型 FOR BIT DATA,则不能将转换表中的字符型 FOR BIT DATA 列作为该表参数的输入。 (定义出现在CREATE PROCEDURE语句中。) 同样,如果转换表的某列不是“FOR BIT DATA”,则不能将其作为输入传递给定义时指定为“FOR BIT DATA”的表参数的对应列。
有关使用表格定位器的更多信息,请参阅在用户定义的函数或存储过程中访问转换表。
特定程序名称
FL 507 将程序名称指定为该程序的具体名称。 名称必须与程序名称一致。如果没有指定模式名称,则模式名称与过程名称(procedure-name) 的显式或隐式模式名称相同。 如果指定模式名称,则该名称必须与过程名称的显式或隐式模式名称相同。
如果您没有指定SPECIFIC子句,则特定名称就是程序的名称。
在以下情况下替换现有程序时,请指定 SPECIFIC 子句。
- 现有程序的参数列表包括一个表格参数
- CREATE语句指定对参数列表(而非参数名称)的更改

- FENCED
- 指定该过程在外部地址空间中运行。
- 动态结果集 整数
- 指定存储过程可以返回的查询结果集的最大数量。 默认值为动态结果集0,表示没有结果集。 数值必须在0-32767之间。
- 启用调试模式、禁用调试模式或禁用调试模式
- 指定程序是否可以在调试模式下运行。 当动态规则运行时,默认值由当前调试模式特殊寄存器的值决定。 否则,默认值为“禁止调试模式”。
除非已启用JAVA语言,否则不要选择此项。
- 允许调试方式
- 指定JAVA程序可在调试模式下运行。
- 禁用调试方式
- 指定JAVA程序不能在调试模式下运行。
您可以使用ALTER PROCEDURE语句将此选项更改为ALLOW DEBUG MODE。
- 禁用调试方式
- 指定JAVA程序永远不能在调试模式下运行。
一旦使用“禁用调试模式”创建或更改了程序,则无法更改程序以指定“允许调试模式”或“禁用调试模式”。 要更改此选项,您必须使用所需的选项删除并重新创建程序。
- 参数 CCSID 或参数 VARCHAR
- 指定字符串参数的编码方案,在LANGUAGE C的情况下,指定可变长度字符串参数的表示形式。
- CCSID
- 指示字符或图形字符串参数的编码方案是ASCII、EBCDIC还是UNICODE。 默认编码方案是参数列表中的CCSID子句或安装面板DSNTIPF中的DEF ENCODING SCHEME字段中指定的值。
该条款为指定字符或图形字符串参数的编码方案提供了便利。 如果除了此 PARAMETER CCSID 子句之外,还为各个参数指定了各个 CCSID 子句, 则所有 CCSID 子句中指定的值必须与此子句中指定的值相同。
该条款还规定了系统生成的常规参数(如消息标记和DBINFO)所使用的编码方案。
- VARCHAR
- 指定了LANGUAGE C的程序中不同长度字符串参数的值的表示形式。
仅当指定了语言C时,才能指定此选项。
- 无效
- 指定可变长度字符串参数以NUL字符结尾的字符串形式表示。
- 结构
- 指定可变长度字符串参数以VARCHAR结构形式表示。
使用参数VARCHAR子句时,无法像使用参数CCSID子句那样指定单个参数的VARCHAR形式。 参数VARCHAR子句仅适用于存储过程参数列表和RETURNS子句中的参数。 它不适用于系统生成的常规参数,例如消息标记和DBINFO。
在数据共享环境中,除非数据共享组的所有成员都支持参数VARCHAR子句,否则不应指定该子句。 如果某些组成员支持此条款,而其他成员不支持,并且外部例程中指定了参数 VARCHAR,则该例程将遇到不同的参数形式,具体取决于调用该例程的组成员。
- EXTERNAL
- 指定使用CREATE PROCEDURE语句定义基于外部编程语言编写的代码的新过程。 如果未指定 NAME 子句,则假定为“NAME 程序名 ”。 LANGUAGE JAVA 过程需要 NAME 子句,因为默认名称对 Java 过程无效。 在某些情况下,默认名称将无效。 为避免无效名称,请为以下类型的程序指定 NAME 子句:
- 该过程被定义为 LANGUAGE JAVA
- 长度超过8字节、包含下划线或不符合普通标识符规则的名称。
- 名称字符串或标识符
- 标识用户编写的用于执行存储过程的代码。
如果语言是JAVA,则必须指定字符串 ,并用单引号括起来,单引号内不能有空格。 它必须指定一个有效的 external-java-routine-name。 如果指定了多个字符串 ,则所有字符串的总长度不得超过1305字节,并且必须用空格或换行符隔开。
外部Java例程名称包含以下部分:- 罐子名
- 标识JAR文件在数据库中安装时所取的名称。 名称包含 jar-id ,可选地使用模式限定。 例如: "myJar" 和 "mySchema.myJar。” 根据以下规则, 无限制的jar-id 将隐式地使用模式名称进行限定:
- 如果语句嵌入程序中,则方案名称即为创建或最近重新绑定包或计划时QUALIFIER绑定选项中的授权ID。 如果未指定限定符,则方案名称为包或计划的所有者。
- 如果语句是动态准备的,则模式名称是当前模式特殊寄存器中的SQL授权ID。
如果指定了 jar-name ,则在处理CREATE PROCEDURE语句时,该jar-name必须存在。 不要为已指定了NO SQL的JAVA程序指定一个jar文件名。
如果未指定 jar-name ,则直接从类文件加载过程,而不是从JAR文件加载。 Db2 搜索与WLM环境关联的CLASSPATH目录。 Java例程的环境变量在数据集中指定,该数据集在JCL上的JAVAENV DD卡中标识,用于启动WLM管理的存储过程的地址空间。
- 方法名
- 标识方法名称,不得超过254字节。 它的包、类和方法ID是Java特有的,因此不限于18个字节。 此外,这些标识符所包含内容的规则与SQL普通标识符的规则并不一定相同。
- 包裹ID
- 识别一个包。 一系列包标识符确定了类标识符所属的包。 如果类属于某个包的一部分,则方法名称必须包含完整的包前缀,例如 "myPacks.StoredProcs Java虚拟机在 "/myPacks/StoredProcs/" 目录中查找类。
- 班级编号
- 标识Java对象的类标识符。
- 方法-ID
- 确定方法标识符与要调用的Java类。
- 方法签名
- 为参数列表确定一个零个或多个Java数据类型的列表,且不得超过1024字节。 如果过程涉及任何可以为空值的输入或输出参数,请指定方法签名。 当调用正在创建的存储过程时, Db2 搜索具有精确方法签名的 Java 方法。 指定的 Java数据类型元素的数量表示Java方法必须具有的参数数量。
Java程序不能有参数。 在这种情况下,您需要为方法签名编写一组空括号。 如果未指定Java 方法签名 , Db2 将搜索一个Java方法,该方法的签名来自CREATE PROCEDURE语句参数列表中指定的SQL类型所关联的默认 JDBC 类型。
对于 LANGUAGE 的其他值,该值必须符合 MVS 载入模块的命名约定:该值必须小于或等于 8 字节,必须符合普通标识符的规则,但不得包含下划线。
- 中文
- 这个必需子句用于指定编写过程主体的语言接口约定。 所有程序必须设计为在服务器环境中运行。 汇编程序、C 语言、 COBOL 和 PL/I 程序必须设计为在 IBM® 的 Language Environment® 中运行。
- 汇编
- 存储过程是用汇编语言编写的。
- C
- 存储过程是用C或C++语言编写的。
- COBOL
- 存储过程是用 COBOL 编写的,包括 OO- COBOL 语言扩展。
- JAVA
- 存储过程是用Java编写的,在Java虚拟机中执行。 当指定 LANGUAGE JAVA 时,必须使用有效的 external-java-routine-name 指定 EXTERNAL NAME 子句,并且必须使用 JAVA 指定 PARAMETER STYLE。 该过程必须是指定Java类的公共静态方法。
当指定了DBINFO、PROGRAM TYPE MAIN或RUN OPTIONS时,请勿指定LANGUAGE JAVA。
- PLI
- 存储过程是用 PL/I 编写的。
- REXX
- 存储过程是用REXX语言编写的。 当PARAMETER STYLE SQL生效时,请勿指定LANGUAGE REXX。 指定 REXX 时,该过程必须使用参数风格“常规”或“常规带空值”。
- 修改SQL数据、读取SQL数据、包含SQL或不含SQL
- 指定此例程可以执行或调用的SQL语句和嵌套例程的分类。 数据库管理员负责验证由程序发出的SQL语句以及由程序在本地调用的所有例程是否符合规范;当调用嵌套的远程例程时,不会进行验证。 有关各语句的分类,请参阅例程的 SQL 语句数据访问分类。
- MODIFIES SQL DATA
- 指定该过程可以执行任何SQL语句,但不支持过程不支持的语句。
- READS SQL DATA
- 指定该过程可以执行带有数据访问指示的语句,包括READS SQL DATA、CONTAINS SQL或NO SQL。 该程序无法执行修改数据的SQL语句。
- CONTAINS SQL
- 指定该过程只能执行访问指示为CONTAINS SQL或NO SQL的SQL语句。 该程序无法执行读取或修改数据的语句。
- NO SQL
- 指定该过程只能执行数据访问分类为“非 SQL”的 SQL 语句。 对于使用JAR文件的JAVA程序,不要指定NO SQL。
- PARAMETER STYLE
- 标识用于将参数传递给存储过程并返回存储过程返回值的链接约定。 所有链接约定都会向存储过程提供参数,这些参数包含在CALL语句中指定的参数。 一些链接协议会将附加参数传递给存储过程,为存储过程提供更多信息。 有关链接约定的更多信息,请参阅外部存储过程的链接约定。
- SQL
- 指定除了CALL语句中的参数外,还将几个附加参数传递给存储过程。 传递以下参数:
- CREATE PROCEDURE语句中指定的前n个参数。
- n个参数 ,用于指示变量的参数。
- 要返回的SQLSTATE。
- 存储过程的限定名。
- 存储过程的特定名称。
- SQL诊断字符串将返回至 Db2。
- 如果指定了 DBINFO,则 DBINFO 结构。
参数 风格 SQL为默认值。 当LANGUAGE REXX或LANGUAGE JAVA生效时,不要指定PARAMETER STYLE SQL。
- 常规
- 指定存储过程使用参数传递机制,其中存储过程仅接收CALL语句中指定的参数。 使用此参数样式定义的程序参数不能为空。
- GENERAL WITH NULLS
- 指定除了在一般中指定的CALL语句中的参数外,另一个参数也传递给存储过程。 附加参数包含一个指示数组,其中每个元素对应CALL语句中的每个参数。 在C语言中,这是一个短整数数组。 指示器阵列使存储过程能够接受或返回空参数值。
- JAVA
- 指定存储过程使用的参数传递约定符合Java和SQLJ例程规范。 仅当语言为JAVA时,才能指定参数JAVA。 当LANGUAGE为JAVA时,必须为PARAMETER STYLE指定JAVA。
INOUT和OUT参数作为单入口数组传递。 INOUT和OUT参数在Java方法中声明为Java类型的单元素数组。
- DETERMINISTIC 或 NOT DETERMINISTIC
- 指定当每次调用存储过程时,如果输入和输出参数相同,存储过程是否返回相同的结果。
- DETERMINISTIC
- 如果数据库中的引用数据没有变化,那么每次调用存储过程时,如果输入和输出参数相同,则存储过程将返回相同的结果。
- NOT DETERMINISTIC
- 即使数据库中的引用数据没有发生变化,存储过程在每次调用时,即使使用相同的输入和输出参数,也可能不会返回相同的结果。 默认值为“非确定性”。
Db2 不验证存储过程代码是否符合确定性或非确定性的规范。
- 没有包路径或包路径包路径
- 指定运行程序时要使用的程序包路径。 这是与该程序相关的DBRM可能包含的包集合列表。
- 无包路径
- 指定该过程的程序包集合列表与调用程序的程序包集合ID列表相同。 如果调用程序未使用包,则 Db2 会依次使用CURRENT PACKAGE PATH特殊寄存器、CURRENT PACKAGESET特殊寄存器或PKLIST绑定选项来解析包。 有关 Db2 如何使用这三项的信息,请参阅绑定申请计划。
- 软件包路径 package-path
- 指定一个包集合列表,格式与SET CURRENT PACKAGE PATH特殊寄存器相同。
如果COLLID子句与PACKAGE PATH一起指定,则在调用例程时,COLLID子句将被忽略。
在准备CALL语句时,会检查创建过程时提供的包路径值。 如果包路径包含 SESSION_USER(或 USER)、PATH 或 PACKAGE PATH,则在检查包路径值时返回错误。
- 没有DBINFO或DBINFO
- 指定在调用存储过程时是否将附加状态信息传递给存储过程。
- NO DBINFO
- 其他信息不会传递。 缺省值为 NO DBINFO。
- DBINFO
- 当调用存储过程时,会传递另一个参数。 参数是一个包含当前服务器名称、应用程序运行时间授权ID以及调用程序的数据库管理器的版本和发行标识等信息。 有关参数及其结构的详细信息,请参阅 DBINFO结构。
只有在指定了参数风格SQL的情况下,才能指定DBINFO。
- NO COLLID 或 COLLID 集合 ID
- 标识执行存储过程时要使用的包集合。 这是与存储过程关联的DBRM绑定到其中的包集合。
- NO COLLID
- 存储过程的包集合与调用程序的包集合相同。 如果调用程序不使用包,则 Db2 会依次使用CURRENT PACKAGE PATH特殊寄存器、CURRENT PACKAGESET特殊寄存器或PKLIST绑定选项来解析包。 有关 Db2 如何使用这三项的详细信息,请参阅绑定应用计划中有关打包分辨率的信息。
默认值为“不碰撞”。
- COLLID collection-id
- 存储过程的包集合是指定的。
对于REXX存储过程 ,collection-id 可以是DSNREXRR、DSNREXRS、DSNREXCR或DSNREXCS。
对于满足这些条件的 Java 存储过程,需要使用 -collection 选项运行 DB2Binder 实用程序,将驱动程序包绑定到由 COLLID 值指定的集合中:- COLLID值与 IBM Data Server Driver for JDBC and SQLJ 的集合。
- jar-name 在外部名称子句中指定。

- WLM 环境
- 当 Db2 存储过程地址空间由WLM建立时,标识存储过程在其中运行的工作负载管理器(WLM)环境。 WLM环境名称是一个SQL标识符。
如果您没有指定 WLM ENVIRONMENT,则存储过程将在安装时指定的默认 WLM 存储过程地址空间中运行。
- 名称
- 存储过程必须运行的WLM环境。 如果另一个存储过程或用户定义的函数调用存储过程,并且调用过程在未与指定的 WLM 环境关联的地址空间中运行,则 Db2 会将存储过程请求路由到不同的地址空间。
- (名字,*)
- 当SQL应用程序直接调用存储过程时,存储过程运行所处的WLM环境。
如果另一个存储过程或用户定义的函数调用该存储过程,则该存储过程将在调用程序使用的相同WLM环境中运行。
您必须拥有WLM环境的相应权限。
- ASUTIME
- 以CPU服务单元为单位,指定存储过程每次调用可运行的处理器总时间。 该值与资源限制规格表的 ASUTIME 列无关。 如果指定了 LANGUAGE JAVA,则忽略此选项。
当您正在调试一个存储过程时,如果存储过程陷入循环,设置一个限制可能会有所帮助。 有关服务单元的信息,请参阅 z/OS MVS Initialization and Tuning Guide。
- 无限制
- 服务单位没有限制。 默认值为“无限制”。
- 极限整数
- CPU服务单元的数量限制为1-2147483647之间的正整数。 如果程序使用的服务单元数量超过指定值, Db2 将取消该程序。 在程序中,并行任务所消耗的CPU周期不计入指定的ASUTIME LIMIT。
- STAY RESIDENT
- 指定存储过程结束之后,存储过程加载模块是否保留在内存中。 如果指定了 LANGUAGE JAVA,则忽略此选项。
- 否
- 存储过程结束后,将从内存中删除负载模块。 NO 是缺省值。
- YES
- 存储过程结束后,负载模块仍保留在内存中。
- PROGRAM TYPE
- 指定存储过程是作为主例程还是子例程运行。
- SUB
- 存储过程作为子程序运行。 使用LANGUAGE JAVA时,PROGRAM TYPE SUB是唯一有效的选项。
- MAIN
- 存储过程作为主程序运行。 使用LANGUAGE REXX时,PROGRAM TYPE MAIN始终有效。
程序类型的默认值为:
- 使用 REXX 语言的 MAIN
- 使用 JAVA 语言的 SUB
- 对于其他语言,默认值取决于当前规则特殊寄存器的值:
- MAIN 当值为 Db2
- 当值为STD时,显示SUB
- 安全
- 指定存储过程如何与外部安全产品(如 RACF® )交互,以控制对非SQL资源的访问。
- Db2
- 存储过程不需要特殊的外部安全环境。 如果存储过程访问外部安全产品保护的资源,则使用与存储过程地址空间关联的授权ID进行访问。 Db2 是缺省值。
- 用户
- 应为存储过程建立外部安全环境。 如果存储过程访问外部安全产品保护的资源,则使用调用存储过程的用户授权ID进行访问。
- 定义者
- 应为存储过程建立外部安全环境。 如果存储过程访问外部安全产品所保护的资源,则使用存储过程所有者的授权ID进行访问。
- 系统默认故障后停止、 nn次故障后停止或故障后继续
- 指定程序在出现一定次数的故障后是否进入停止状态。
- 系统默认故障后停止
- 指定在安装面板 DSNTIPX 上,当出现 MAX ABEND COUNT 字段值所指示的故障次数时,应将此例程置于停止状态。 这是缺省值。
- 在nn次失败后停止
- 规定在发生nn次故障后,该程序应置于停止状态。 值nn 可以是1-32767之间的整数。
- 失败后继续
- 规定在任何故障发生后,该程序不应处于停止状态。
- 运行选项 runtime-options
- 指定存储过程使用的 Language Environment 运行时选项。 对于 REXX 存储过程,指定 Language Environment 运行时选项,将其传递给 Db2 的 REXX 语言接口。 您必须将运行时选项指定为不超过254字节的字符串。 如果不指定 RUN OPTIONS 或传递空字符串, Db2 不会向 Language Environment 传递任何运行时选项, Language Environment 会使用其安装默认值。
当LANGUAGE JAVA生效时,不要指定运行选项。
有关 Language Environment 运行时选项的说明,请参阅 Language Environment Programming Reference。
- COMMIT ON RETURN
- 指示 Db2 是否在从存储过程返回时立即提交事务。
- 否
- Db2 当存储过程返回时,不会发出提交。 NO 是缺省值。
- YES
- Db2 当存储过程返回时,如果以下语句为真,则发出提交:
- CALL语句返回的SQLCODE不是负数。
- 存储过程没有处于必须中止状态。
提交操作包括调用应用程序进程和存储过程执行的工作。
如果存储过程返回结果集,则与结果集关联的游标必须定义为“保持”,才能在提交后使用。
- 继承特殊注册或默认特殊注册
- 指定在进入例程时如何设置特殊寄存器。 默认值为“继承特殊注册”。
- INHERIT SPECIAL REGISTERS
- 指定特殊寄存器的值根据特殊寄存器特性表中列出的规则进行继承,这些特性表位于特殊寄存器、用户定义函数或存储过程。
- 默认特殊注册
- 指定特殊寄存器初始化为默认值,如用户定义函数或存储过程的特殊寄存器表中存储过程特殊寄存器特征的规则所示。
- CALLED ON NULL INPUT
- 指定即使任何或所有参数值为空,也要调用该过程,这意味着必须对过程进行编码,以测试参数值是否为空。 该过程可能返回空值或非空值。 默认值为“调用空输入”。
CREATE PROCEDURE(外部)的注释
- 各类手术注意事项
- 有关适用于所有类型过程的注意事项,请参阅 CREATE PROCEDURE语句(概述 )。
- 字符串表示注意事项
参数VARCHAR子句是外部程序特有的,因为C语言中原生使用以NUL结尾的字符串。 当字符串数据已知包含嵌入的NUL终止符时,VARCHAR结构表示很有用。 当不能保证字符串数据不包含嵌入的NUL终止符时,它也很有用。
参数 VARCHAR 不适用于固定长度的字符串、VARCHAR FOR BIT DATA、CLOB、DBCLOB 或隐式生成的参数。 该条款不适用于 VARCHAR FOR BIT DATA,因为 BIT DATA 可以包含 X'00' 字符 ,其值表示以长度信息开头。 它不适用于LOB数据,因为LOB值的表示以长度信息开头。
参数VARCHAR不适用于隐式提供给外部程序的可选参数。 例如,LANGUAGE C的CREATE PROCEDURE语句还必须指定PARAMETER STYLE SQL,该语句返回一个以NUL字符结尾的SQLSTATE字符串;该SQLSTATE不会以VARCHAR结构形式表示。 同样,代表程序限定名称、程序特定名称或返回给数据库管理器的 SQL 诊断字符串的参数都不会以 VARCHAR 结构形式表示。
- 运行存储过程的环境
- 您可以使用 WLM ENVIRONMENT 子句来确定存储过程运行所在的地址空间。 通过使用不同的 WLM 环境,您可以将一组程序与另一组程序隔离开。 例如,您可以根据安全要求隔离程序,并将所有工资单应用程序放置在一个WLM环境中,因为这些应用程序处理敏感数据,例如员工工资。无论存储过程在何处运行, Db2 都会调用 RACF 来确定您是否拥有适当的授权。 您必须获得授权才能发布CREATE PROCEDURE语句,这些语句引用指定的WLM环境或 Db2 建立的存储过程地址空间。 例如,以下 RACF 命令授权 Db2 用户 DB2USER1 在 Db2 子系统 DB2A 上定义存储过程,这些过程在名为PAYROLL的WLM环境中运行。
PERMIT DB2A.WLMENV.PAYROLL CLASS(DSNR) ID(DB2USER1) ACCESS(READ) - 其他语法和同义词
- 为了与 Db2 的早期版本或 Db2 系列中的其他产品兼容, Db2 支持以下替代语法 :
- 结果集(RESULT SET)作为动态结果集(DYNAMIC RESULT SET)的同义词
- 结果集(RESULT SETS)是动态结果集(DYNAMIC RESULT SETS)的同义词
- 标准呼叫(STANDARD CALL)作为 DB2SQL
- 简单通话是通用电话的代名词
- 将“简单调用空值”作为“一般调用空值”的同义词
- VARIANT作为“非确定性”的同义词
- NOT VARIANT 并非“确定性”的同义词
- NULL CALL作为CALLED ON NULL INPUT的同义词
- 参数风格 DB2SQL 作为参数风格的同义词 SQL
CREATE PROCEDURE(外部)示例
- 示例 1
- 为一个存储过程创建定义,该存储过程是用 COBOL 编写的。 该程序接受一个装配零件编号,并返回组成该装配的零件数量、零件总成本以及结果集。 结果集列出了每个零件的零件编号、数量和单价。 假设输入参数不能包含空值,且该过程将在名为PARTSA的WLM环境中运行。
CREATE PROCEDURE SYSPROC.MYPROC(IN INT, OUT INT, OUT DECIMAL(7,2)) LANGUAGE COBOL EXTERNAL NAME MYMODULE PARAMETER STYLE GENERAL WLM ENVIRONMENT PARTSA DYNAMIC RESULT SETS 1; - 示例 2
- 为示例1中描述的存储过程创建定义,但使用传递比CALL语句中指定的参数更多的信息的链接约定。 指定 Language Environment 运行时选项 HEAP、BELOW、 ALL31 和 STACK。
CREATE PROCEDURE SYSPROC.MYPROC(IN INT, OUT INT, OUT DECIMAL(7,2)) LANGUAGE COBOL EXTERNAL NAME MYMODULE PARAMETER STYLE SQL WLM ENVIRONMENT PARTSA DYNAMIC RESULT SETS 1 RUN OPTIONS 'HEAP(,,ANY),BELOW(4K,,),ALL31(ON),STACK(,,ANY,)'; - 示例 3
- 创建一个用Java编写的存储过程的程序定义,该过程接收一个零件编号,并返回零件成本和当前可用数量。
CREATE PROCEDURE PARTS_ON_HAND(IN PARTNUM INT, OUT COST DECIMAL(7,2), OUT QUANTITY INT) LANGUAGE JAVA EXTERNAL NAME 'PARTS.ONHAND' PARAMETER STYLE JAVA;
