CREATE PROCEDURE 语句(SQL - 本机过程)
CREATE PROCEDURE 语句用于在当前服务器上定义 SQL 过程或过程版本,并指定过程的源语句。
FL 507- 如果未指定版本子句,则替换过程定义。
- 如果指定了 VERSION 子句,且指定的版本存在,则版本将被替换。 否则,版本将添加到程序定义中。
本机SQL程序可以包含SQL控制语句。 有关原生 SQL 程序中支持的 SQL 控制语句的信息,请参阅 SQL 过程语言(SQL PL )。

CREATE PROCEDURE(SQL - 本地)调用
此语句只能动态编写,并且必须以隐式或显式方式指定DYNAMICRULES运行行为。

CREATE PROCEDURE(SQL - 原生)授权
- 模式中的CREATEIN特权
- 系统 DBADM 权限
- SYSCTRL 权限
- SYSADM 权限
- 安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)
与模式名称匹配的授权ID隐式拥有该模式的CREATEIN权限。
- 程序的所有权
- DROPIN和CREATEIN特权在架构上
- 系统 DBADM 权限
- SYSCTRL 权限
- SYSADM 权限
- 安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)
- 程序的所有权
- 架构上的ALTERIN权限
- 系统 DBADM 权限
- SYSCTRL 权限
- SYSADM 权限
- 安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)
- 用户自定义类型的所有权
- 用户自定义类型的使用权限
- 系统 DBADM 权限
- DATAACCESS 权限
- SYSADM 权限
- 对表的所有权
- 表中的 SELECT 权限
- DATAACCESS 权限
- SYSADM 权限
如果您指定了 WLM ENVIRONMENT FOR DEBUG MODE 子句,则将调用 RACF 或外部安全产品来检查在 WLM 环境中定义程序所需的权限。 如果WLM环境访问在 RACF 中受到保护,则权限集必须包含所需的权限。
要创建或替换存储过程,或添加或替换存储过程的版本,权限集必须包含添加新软件包或现有软件包的新版本所需的授权,具体取决于安装面板 DSNTIPP 上 BIND NEW PACKAGE 字段的值,或者权限集必须包含 SYSADM、SYSCTRL 或系统 DBADM 授权。 程序包的所有者必须拥有执行 SQL-routine-body语句所需的权限。
如果将“独立安全子系统”参数设置为“否”,则系统管理员权限将隐含安全管理员权限。
根据程序定义的内容 ,SYSDUMMYx表可能需要额外的授权。 更多信息,请参阅 SYSDUMMYx表格。
如果用于创建过程的授权ID具有安装SYSADM权限或安装SYSOPR权限,并且当前SQLID设置为SYSINSTL,则该过程将被识别为系统定义的过程。
权限设置:
特权集是指进程的SQL授权ID所拥有的特权,除非该进程处于可信环境中,并且指定了ROLE AS OBJECT OWNER子句。 在这种情况下,特权集是指与流程的主要授权ID关联的角色所拥有的特权。
- 如果未指定 "软件包所有者 "选项,与用户相关联的角色将成为软件包所有者。
- 如果指定了“包所有者”选项,则“包所有者”选项中指定的角色将成为包所有者。 在可信的环境中,指定的“包裹所有者”必须是一个角色。
- 如果没有指定“包裹所有者”选项,则与活页夹关联的角色将成为包裹所有者。
- 如果指定了“包所有者”选项,则“包所有者”选项中指定的角色将成为包所有者。 在可信的环境中,指定的“包裹所有者”必须是一个角色。
- 如果没有指定“程序包所有者”选项,则程序所有者将成为程序包所有者。
- 如果指定了“包所有者”选项,则“包所有者”选项中指定的授权名称将成为包所有者。

CREATE PROCEDURE(SQL - 原生)的语法
参数声明:
参数类型:
数据类型:
内置类型:
选项列表 :(选项可以任意顺序排列,但每个选项只能出现一次。)
程序定义:
SQL-routine-body:
CREATE PROCEDURE(SQL - 原生)描述
OR REPLACE
指定如果当前服务器上存在该过程,则替换现有定义,或者添加或替换该过程的版本。 如果当前服务器上不存在过程定义,那么将忽略此选项。 如果存在具有指定名称的程序,则现有程序必须是本机 SQL 程序。
如果该过程不存在且未指定 VERSION 关键字,则使用该过程的初始版本 ( V1 ) 创建该过程。
如果存在该过程,且未指定 VERSION 关键字,则该过程将被替换。 在目录中用新定义替换旧定义之前,先删除旧定义,但该程序所授予的特权不受影响。 该过程可重新创建如下:- 任何现有评论将被删除
- 程序定义可能会改变
- 与程序定义相关的时间戳被更新
- 程序所有者可以更改
- 对于未明确指定的选项,系统将使用默认值,即使这些选项在最初定义被替换的过程时已明确指定。
要替换现有流程,该流程的版本定义不能超过一个版本,或者版本标识不是 V1。 此外,必须满足以下条件之一:- 特定条款必须与程序名称一起指定
- 新定义的签名必须与现有程序定义的签名一致,参数名称除外
如果指定版本的存储过程存在,并且指定了 VERSION 关键字,则会在目录中替换版本,就像使用 REPLACE VERSION 子句发出 ALTER PROCEDURE 语句一样。 流程所有者不会改变。 绑定替换后的版本可能会导致新的访问路径,即使例程主体没有改变。
当您替换一个版本的程序时,参数的数据类型、CCSID 规格和字符数据属性(FOR BIT/SBCS/MIXED DATA)必须与当前活动版本程序中相应参数的属性相同。 参数列表中不能包含表格参数。 对于未明确指定的选项,将使用这些选项的系统默认值,即使这些选项在最初定义被替换的过程版本时已明确指定。 指定禁用调试模式的程序版本则不在此列。 如果为某个版本的存储过程指定了“禁用调试模式”,则无法使用带有OR REPLACE子句的CREATE语句来更改该选项。
如果存在程序,但版本 routine-version-id 不存在 ,且指定了 VERSION 关键字,则创建指定的版本。 routine-version-id 是新版本的程序版本标识符。 新版本定义为:如果使用ADD VERSION子句发布ALTER PROCEDURE语句。 流程所有者不会改变。 当替换一个程序定义时,目录中该程序定义的任何现有注释都会被删除。
当您添加新版本的程序时,参数的数据类型、CCSID 规格和字符数据属性(FOR BIT/SBCS/MIXED DATA)必须与当前活动版本程序中相应参数的属性相同。 参数列表中不能包含表格参数。 参数名称可能与该过程的其他版本有所不同。 对于未明确指定的选项,将使用系统默认值。

- 程序名

FL 507 程序名称。 名称(包括隐式或显式模式名称)不得标识当前服务器上存在的过程。 但是,当同时指定OR REPLACE关键字时,您可以指定一个现有的过程名称。
如果CREATE语句添加或替换了现有包装过程的版本,则该名称不得识别该过程。

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


- (参数声明 ……)
- 指定过程的参数数量、数据类型和每个参数的用途,以及正在定义的过程版本的每个参数的名称。 对于本程序的所有其他版本,参数的数量、指定的数据类型以及每个参数的用法必须与参数对应位置的数据类型相匹配。 数据类型的同义词被视为匹配项。 所有参数均为空值。
IN、OUT和INOUT指定参数的使用。 参数的使用必须与同一程序的其他版本中参数的隐式或显式使用相匹配。
- IN
- 识别作为过程输入参数的参数。 在进入程序时,参数的值是返回给调用SQL应用程序的值,即使程序中对该参数进行了更改。
IN 是缺省方式。
- OUT
- 将参数标识为过程返回的输出参数。 如果未在程序中设置参数,则返回空值。
- INOUT
- 识别作为过程输入输出参数的参数。 如果参数未在程序中设置,则返回其输入值。
- 参数名称
- 指定用作SQL变量的参数。 参数名称不能与该版本程序的任何其他参数名称相同。 此版本程序中的参数名称可能与此程序其他版本中相应参数的名称不同。
- 内置式
- 参数的数据类型为内置数据类型。
有关数据类型的更多信息,包括字符数据类型的子类型 (FOR子类型DATA子句 ),请参阅 CREATE TABLE语句中的 “内置类型 ”。 然而,与CREATE TABLE语句相比,不同长度的字符串数据类型具有不同的最大长度。 参数(和SQL变量)的最大长度如下:VARCHAR或VARBINARY为32704,VARGRAPHIC为16352。
对于字符或图形数据类型的参数,PARAMETER CCSID子句或CCSID子句指示参数的编码方案。 如果您没有指定这两个条款中的任何一个,编码方案就是安装面板 DSNTIPF 上的字段 DEF ENCODING SCHEME 的值。
虽然字符数据类型的输入参数具有隐式或显式指定的子类型(BIT、SBCS或MIXED),但实际传入输入参数的值可以具有任何子类型。 因此,在调用该过程时,可能会将输入数据转换为参数的子类型。 在使用ASCII或EBCDIC时,如果将实际包含DBCS字符的混合数据用作以SBCS子类型声明的输入参数的值,则会发生错误。
日期时间数据类型或不同类型的参数将以不同数据类型的形式传递给函数:- 日期时间类型参数以字符数据类型传递,数据以ISO格式传递。 日期时间类型参数的编码方案与任何字符或图形字符串参数的隐式或显式编码方案相同。 如果没有传递字符串或图形字符串参数,则编码方案为安装面板 DSNTIPF 上的字段 DEF ENCODING SCHEME 的值。
- 一个不同的类型参数作为不同类型的源类型传递。
- AS定位器
- 指定将参数值的定位器传递给过程,而不是实际值。 仅对具有LOB数据类型或基于LOB数据类型的独特类型的参数指定AS LOCATOR。 传递定位符而不是值可以减少传递给过程的字节数,特别是当参数值非常大时。
AS LOCATOR子句对确定数据类型是否可以提升没有影响。
- distinct-type-name
- 输入参数的数据类型是不同的类型。 参数的任何长度、精度、比例、子类型或编码方案属性都是不同类型的源类型的属性。 该类型不能基于LOB数据类型。
- 数组类型名称
- 输入参数的数据类型为用户定义的数组类型。
如果您指定了数组类型名称而没有模式名称, Db2 将通过在SQL路径中搜索模式来解析数组类型。
- TABLE LIKE 表名作为定位器
- 指定参数为转换表。 然而,当调用该过程时,转换表中的实际值不会传递给该过程。 而是传递一个单一的值。 这个单一值是表的定位符,程序通过它来访问转换表的列。 已识别的表可以包含XML列,但该过程不能引用这些XML列。 带表参数的流程只能从触发器的触发操作中调用。
当 CREATE 语句添加或替换现有存储过程的版本时,不得指定 TABLE LIKE 子句。
- 版本号 routine-version-id
- 指定要定义的程序版本的版本标识符。 有关指定例程版本 ID 的信息,请参阅 SQL 中的命名约定。 您可以使用带有ADD VERSION子句的ALTER PROCEDURE语句或BIND DEPLOY命令来创建附加版本的存储过程。
V1 是默认的版本标识符。
重要提示: 请勿通过指定 VERSION 关键字来创建 Db2 附带程序的附加版本。 仅支持 Db2 提供的版本。 此类例程的其他版本会导致所提供例程的安装和配置失败。 - LANGUAGE SQL
- 指定该过程是用 Db2 SQL过程语言编写的。
特定程序名称
将过程名称指定为过程的具体名称。 名称必须与程序名称一致。
如果您没有指定模式名称,则它与过程名称 (procedure-name) 的显式或隐式模式名称相同。 如果指定模式名称,则该名称必须与过程名称的显式或隐式模式名称相同。
如果您没有指定SPECIFIC子句,则特定名称就是程序的名称。 具体名称存储在SYSROUTINES目录表的SPECIFIC列中。
在以下情况下替换现有程序时,请指定 SPECIFIC 子句:- 现有程序的参数列表中包含一个表格参数。
- CREATE语句指定对参数列表的更改,而不是对参数名称的更改。

- DETERMINISTIC 或 NOT DETERMINISTIC
- 指定每次调用时,使用相同的输入和输出参数,程序是否返回相同的结果。
- DETERMINISTIC
- 如果数据库中引用的数据没有变化,那么每次调用该过程并使用相同的IN和INOUT参数时,结果总是相同的。
- NOT DETERMINISTIC
- 即使数据库中引用的数据没有变化,每次调用时,使用相同的IN和INOUT参数,该过程可能不会返回相同的结果。
默认值为“非确定性”。
Db2 不验证程序代码是否符合确定性或非确定性的规范。
- 修改 SQL 数据、读取 SQL 数据或包含 SQL
- 指定此例程可以执行或调用的SQL语句和嵌套例程的分类。 数据库管理员负责验证由程序发出的SQL语句以及由程序在本地调用的所有例程是否符合规范;当调用嵌套的远程例程时,不会进行验证。 有关各语句的分类,请参阅例程的 SQL 语句数据访问分类。
- MODIFIES SQL DATA
- 指定该过程可以执行任何SQL语句,但不支持过程不支持的语句。
默认值为“修改 SQL 数据”。
- READS SQL DATA
- 指定该过程可以执行带有数据访问指示的语句,该指示为读取SQL数据或包含SQL。 该程序无法执行修改数据的SQL语句。
- CONTAINS SQL
- 指定该过程只能执行数据访问指示为CONTAINS SQL的SQL语句。 该程序无法执行读取或修改数据的语句。
- CALLED ON NULL INPUT
- 指定如果任何参数值或所有参数值均为空,则调用该过程。
- 动态结果集 整数
- 指定程序可以返回的查询结果集的最大数量。 默认值为动态结果集0,表示没有结果集。 数值必须在0-32767之间。
- ALLOW DEBUG MODE、 DISALLOW DEBUG MODE或 DISABLE DEBUG MODE
- 指定此版本的例程是否可以在调试模式下运行。 默认值由当前调试模式特殊寄存器的值决定。
- ALLOW DEBUG MODE
- 指定此版本的例程可在调试模式下运行。 当调用此版本的例程并尝试调试时,必须有一个WLM环境可用。
- DISALLOW DEBUG MODE
- 指定此版本的例程不能在调试模式下运行。
您可以使用ALTER语句将此选项更改为ALLOW DEBUG MODE,用于此例程的初始版本。
- DISABLE DEBUG MODE
- 指定此版本的例程不能在调试模式下运行。
在创建或更改此版本的例程以使用“禁用调试模式”后,无法更改此版本的例程以指定“允许调试模式”或“禁用调试模式”。 要更改此选项,请删除该例程,然后使用所需的选项重新创建。 除了删除并重新创建例程之外,还可以创建一个使用所需选项的例程版本,并将其设置为活动版本。
当禁用调试模式生效时,调试模式的WLM环境将被忽略。
- PARAMETER CCSID
- 指示字符或图形字符串参数的编码方案是ASCII、EBCDIC还是UNICODE。 默认编码方案是在参数列表的CCSID子句中指定的值,或在安装面板DSNTIPF的DEF ENCODING SCHEME字段中指定的值。
该条款为指定字符或图形字符串参数的编码方案提供了便利。 如果除了此 PARAMETER CCSID 子句之外,还为单个参数指定了单独的 CCSID 子句,则所有 CCSID 子句中指定的值必须与此子句中指定的值相同。
如果参数的数据类型是用户定义的字符串或图形类型,则该字符串或图形类型的CCSID必须与此子句中指定的值相同。
如果参数的数据类型是用户定义的数组类型,且该类型由字符或图形字符串数组元素或字符串数组索引定义,则这些数组属性的 CCSID 必须与此子句中指定的值相同。
该条款还规定了用于系统生成的常规参数的编码方案。
- QUALIFIER 模式名称
- 指定隐式限定符,用于在过程体中引用的非限定对象名称。 有关如何确定此选项的默认值的信息,请参阅无限制别名、索引、JAR文件、掩码、权限、序列、表、触发器和视图名称。
- PACKAGE OWNER 授权名称
- 指定与例程版本关联的包的所有者。 进程的SQL授权ID为默认值。
- ASUTIME
- 以CPU服务单元为单位,指定单个例程调用可以运行的总处理器时间。 该值与资源限制规格表的 ASUTIME 列无关。
当您正在调试一个程序时,如果程序陷入循环,设置一个限制可能会有所帮助。 有关服务单元的信息,请参阅 z/OS MVS Initialization and Tuning Guide。
- 无限制
- 规定服务单元没有限制。
默认值为 “无限制 ”。
- LIMIT 整数
- CPU服务单元的数量限制为1-2 147 483 647之间的正整数。 如果程序使用的服务单元数量超过指定值, Db2 将取消该程序。 在程序中,并行任务所消耗的CPU周期不计入指定的ASUTIME LIMIT。
- COMMIT ON RETURN NO, COMMIT ON RETURN YES ,或 AUTONOMOUS
- 指示 Db2 是否在程序返回时立即提交交易。
- COMMIT ON RETURN NO
- Db2 当程序返回时,不会发出提交。 NO 是缺省值。
- COMMIT ON RETURN YES,
- Db2 当程序返回时,如果以下语句为真,则发出提交:
- CALL语句返回的SQLCODE不是负数。
- 该程序并非必须中止。
提交操作包括调用应用程序进程和过程执行的工作。
如果该过程返回结果集,那么与结果集相关联的游标必须已定义为 WITH HOLD,以便在落实后可用。
- AUTONOMOUS
- Db2 在独立于调用应用程序的工作单元中执行SQL过程。 当指定此选项时,在返回调用应用程序之前,程序将遵循“返回时提交”选项的规则。 但是,它不会更改呼叫应用程序。 当指定自动驾驶时:
- 动态结果集0必须有效。
- 存储过程参数不得定义为:
- 一种LOB类型
- XML数据类型
- 一种基于LOB或XML值的独特数据类型
- 定义为包含LOB类型数组元素的数组类型
当自动程序正在执行时,不能为全局变量赋值。
- 继承特殊登记或 DEFAULT SPECIAL REGISTERS
- 指定在进入例程时如何设置特殊寄存器。
- WLM ENVIRONMENT FOR DEBUG MODE 名字
- 指定 Db2 在调试程序时使用的WLM(工作负载管理器)应用程序环境。 WLM环境名称是一个SQL标识符。
如果您没有指定调试模式的WLM环境, Db2 将使用安装时指定的默认WLM存储过程地址空间。
您必须拥有WLM应用环境的相应权限。
当禁用调试模式时,调试模式下的WLM环境值将被忽略。
- DEFER PREPARE 或者 NODEFER PREPARE
- 指定是延迟准备引用远程对象的动态 SQL 语句,还是立即准备。
默认值取决于REOPT选项的生效值。 如果启用“不重新规划”,则默认值将在运行时从计划中继承。 否则,默认值为“推迟准备”。
- DEFER PREPARE
- 指定将推迟准备引用远程对象的动态 SQL 语句。
有关分布式处理的注意事项,请参阅 DEFER和NODEFER绑定选项。
- NODEFER PREPARE
- 指定不会推迟准备引用远程对象的动态 SQL 语句。
- CURRENT DATA YES 或当前数据 无
- 指定当游标稳定性隔离级别生效时,是否要求只读和模糊游标的数据保持最新。 当前数据还决定着块获取是否可用于分布式、模糊游标。
- CURRENT DATA YES
- 指定只读和模糊游标需要数据货币。 Db2 已获取页面或行锁以确保数据更新。 对于分布式、模糊游标,块获取将被忽略。
- 当前数据 无
- 指定只读和模糊游标不需要数据货币。 对于分布式、模糊游标,允许块获取。 如果常规操作试图在打开模糊游标后动态准备并执行DELETE WHERE CURRENT OF语句,则不建议使用 CURRENT DATA NO。 如果您的常规语句试图对以下游标使用DELETE WHERE CURRENT OF语句,则会收到负SQLCODE:
- 正在使用块获取的光标
- 使用并行性查询的游标
- 放置在由此或另一个应用程序进程修改的行上的游标
当前数据编号为默认值。
- DEGREE
- 指定是否尝试使用并行处理来运行查询,以最大限度地提高性能。
- 1
- 指定不应使用并行处理。
1是默认值。
- 任何
- 指定可以使用并行处理。
- CONCURRENT ACCESS RESOLUTION
- 指定处理过程是仅使用已提交的数据,还是等待正在更新中的数据的提交或回滚。
- WAIT FOR OUTCOME
- 指定处理将等待正在更新中的数据的提交或回滚。
- USE CURRENTLY COMMITTED
- 指定当遇到正在更新的数据时,处理过程使用当前提交的数据版本。 USE
CURRENTLY COMMITTED 适用于访问通用表空间中定义的表的扫描,这些表具有行级或页级锁定大小。
当读取事务和插入事务之间存在锁争用时, USE CURRENTLY COMMITTED 适用于隔离级别为CS或RS的扫描。 适用的扫描包括针对只读和模糊查询以及可更新游标的意向读取扫描。 USE CURRENTLY COMMITTED 也适用于从UPDATE或DELETE语句的WHERE子句和INSERT语句的子选择中启动的扫描。
当读事务和删除事务之间存在锁争用时, USE CURRENTLY COMMITTED 适用于隔离级别为CS且指定了CURRENT DATA NO的扫描。
- DYNAMICRULES
- 指定在运行时对以下动态 SQL 属性适用的值:
- 用于检查授权的授权标识
- 用于不合格对象的限定符
- Db2 用于解析和语义验证动态SQL语句的应用程序编程选项的源文件
DYNAMICRULES还指定动态SQL语句是否可以包含GRANT、REVOKE、ALTER、CREATE、DROP和RENAME语句。
除了DYNAMICRULES条款的价值外,例程的运行时环境还控制动态SQL语句在运行时的行为。 DYNAMICRULES值和运行环境共同决定了动态SQL属性的值。 该组属性值被称为动态 SQL 语句行为。 可以指定下列值:- 运行
- 指定动态 SQL 语句将使用运行行为进行处理。
默认值为“运行 ”。
- BIND
- 指定动态 SQL 语句将使用绑定行为进行处理。
- DEFINEBIND
- 指定动态 SQL 语句将使用定义行为或绑定行为进行处理。
- DEFINERUN
- 指定动态 SQL 语句将使用定义行为或运行行为进行处理。
- INVOKEBIND
- 指定动态 SQL 语句将使用调用行为或绑定行为进行处理。
- INVOKERUN
- 指定动态 SQL 语句使用调用行为或运行行为进行处理。
- APPLICATION ENCODING SCHEME
- 指定例程主体中静态 SQL 语句中 SQL 变量的默认编码方案。 如果未指定CCSID子句作为数据类型的一部分,且未指定参数CCSID例程选项,则该值用于在复合语句中定义SQL变量。
- ASCII
- 指定使用服务器的ASCII CCSID对数据进行编码。
- EBCDIC
- 指定使用服务器的EBCDIC CCSID对数据进行编码。
- UNICODE
- 指定使用服务器的Unicode CCSID对数据进行编码。
有关如何确定此选项的默认值的信息,请参阅 ENCODING 绑定选项中的 ENCODING 绑定选项。
- WITH EXPLAIN 或无需解释
- 指定是否提供有关例程中SQL语句如何执行的信息。
- 无需解释
- 指定不提供有关例程中的SQL语句如何执行的信息。
如果语句嵌入在用WITHOUT EXPLAIN指定的例程中,则可以通过在例程主体中嵌入SQL语句EXPLAIN来获得该语句的EXPLAIN输出。 否则,EXPLAIN选项适用于例程主体中的所有可解释的SQL语句,以及任何DECLARE CURSOR语句的fullselect部分。
默认值为 “无解释 ”。
- WITH EXPLAIN
- 指定提供有关例程中SQL语句如何执行的信息。 信息被插入到表所有者.PLAN_TABLE中。 owner 是例程所有者的授权ID。 或者,例程所有者的授权ID可以有一个别名, 例如owner.PLAN_TABLE ,指向基础表PLAN_TABLE。 所有者还必须对该表拥有适当的 SELECT 和 INSERT 权限。 WITH EXPLAIN不会获取访问远程对象的语句的信息。 PLAN_TABLE必须有一个基本表,可以有多个别名,表名相同,但结构限定符不同。
它不能是视图或同义词,并且应在处理 CREATE 语句之前就存在。
在所有对 owner.PLAN_TABLE 的插入中,QUERYNO 的值是 Db2 分配的语句编号。如果存在DSN_STATEMNT_TABLE和DSN_FUNCTION_TABLE两个可选表,则WITH EXPLAIN选项也会填充这两个表。 DSN_STATEMNT_TABLE包含SQL语句的处理成本估算,DSN_FUNCTION_TABLE包含函数解析的信息。 更多信息,请参见 EXPLAIN表。
有关 EXPLAIN 语句的更多信息,包括 WITH EXPLAIN 选项填充的表的说明,请参阅 EXPLAIN 语句。
- WITH IMMEDIATE WRITE 或无需立即撰写
- 指定是否对组缓冲池相关页面集或分区进行更新时立即写入。 此选项仅适用于数据共享环境。 即时写入子系统参数不影响此选项。 即时写入绑定选项显示了即时写入绑定选项(与常规选项类似)的隐含层次结构,因为它会影响运行时间。
- 无需立即撰写
- 指定执行正常的写入活动。 依赖于组缓冲池的更新页面在提交的第一阶段或之前写入,或者对于已回滚的事务,在中止结束时写入。
默认值为“不立即写入 ”。
- WITH IMMEDIATE WRITE
- 指定一旦缓冲区更新完成,立即写入依赖于组缓冲池的更新页面。 即使缓冲区在事务处理前进或回滚期间更新,更新的页面也会立即写入。 WITH IMMEDIATE WRITE 可能会影响性能。
- ISOLATION LEVEL RR、 RS、CS 或 UR
- 指定程序与正在运行的其他应用程序的影响隔离的程度。 如需了解隔音等级信息,请参阅 “选择隔音选项 ”。
- RR
- 指定可重复读取。
- RS
- 指定读取稳定性。
- CS
- 指定光标稳定性。 CS 是默认设置。
- UR
- 指定未承诺的阅读。
- 保持动态或取消保持动态
- 指定 Db2 是否在提交点之后保留动态SQL语句。
- 保持活力
- 指定 Db2 在提交点之后不保留动态SQL语句。
默认设置是“不保持动态”。
- 保持活力
- 指定 Db2 在提交点之后保留动态SQL语句。 如果您指定了“保持动态”,应用程序就不需要在每个提交点后准备SQL语句。 Db2 保持动态 SQL 语句,直到发生以下情况之一:
- 申请流程结束
- 发生回滚操作
- 应用程序执行一个显式的 PREPARE 语句,该语句的标识符与动态 SQL 语句相同
如果您指定了 WITH KEEP DYNAMIC,并且动态语句缓存处于活动状态,则 Db2 子系统会在缓存中保留已准备语句的副本。 如果动态语句缓存未激活,则子系统仅保留提交点之后的SQL语句字符串。 如果应用程序对该语句执行OPEN、EXECUTE或DESCRIBE操作,则该语句被隐式准备。
如果您指定了“保持动态”,则用于执行具有此选项的程序或包的DDF服务器线程将保持活动状态。 活动 DDF 服务器线程会因空闲线程超时而终止。 更多信息请参阅 “空闲线程超时”字段(IDTHTOIN子系统参数 )。
如果您指定了“保持动态”,则不能指定“始终重新选择”。 保持动态和始终重新选择是相互排斥的。 但是,您可以指定“保持动态”和“重新选择一次”。
如果您的DRDA客户端应用程序使用定义为WITH HOLD的光标,请使用WITH KEEP DYNAMIC来提高性能。 当没有更多行需要检索时, Db2 子系统会自动关闭光标,从而避免发送额外的网络消息。
- OPTHINT 'hint-id '
- 指定是否将查询优化提示用于例程主体中包含的静态 SQL 语句。
hint-id 是一个长度不超过128字节的字符串, Db2 子系统在PLAN_TABLE中搜索行作为输入时使用。 默认值为空字符串(''),表示 Db2 子系统不对静态SQL语句使用优化提示。
优化提示仅在您的系统启用了优化提示时可用。 更多信息,请参阅 “优化提示”字段(OPTHINTS子系统参数 )。
- SQL PATH
指定 Db2 用于解析过程体中静态SQL语句中未限定用户定义的类型、函数和过程名称的SQL路径。
该选项不适用于存储过程正文中的动态 SQL 语句。 Db2 使用 CURRENT PATH 特殊寄存器值来解析动态 SQL 语句中未限定的用户定义类型、函数和存储过程名称。
SQL PATH的默认值为 “SYSIBM”、“SYSFUN”、“SYSPROC”、“SYSIBMADM ”,QUALIFIER选项的值为语句目标过程的限定符。
无需明确指定 “SYSIBM”、“SYSFUN”、“SYSPROC”、“SYSIBMADM” 等架构。 如果这些模式中未明确指定任何模式,则会在SQL路径的开头隐式假设。
Db2 通过以下方式计算长度:取指定的每个模式名称 ,删除其末尾的空白,在其前后添加两个分隔符,并在每个模式名称后添加一个逗号,但最后一个除外。 生成的字符串长度不能超过当前模式特殊寄存器的长度。 如果您没有指定 “SYSIBM”、“SYSFUN”、“SYSPROC”、“SYSIBMADM ”模式,它们将不会包含在SQL路径的长度中。 如果SQL路径的总长度超过了CURRENT PATH特殊寄存器的长度, Db2 将返回CREATE语句的错误。
有关更多信息,请参阅以下相关主题:
- schema-name
- 指定模式。 Db2 在处理CREATE语句时,不保证指定的模式实际存在。
SYSPUBLIC不能指定为SQL路径。
- 架构名称列表
- 指定以逗号分隔的架构名称列表。 同一个模式名称不应在模式名称列表中出现两次以上。 可指定的模式名称数量受生成的 SQL 路径最大长度的限制。
SYSPUBLIC不能指定为SQL路径。
- 系统 PATH
- 指定架构名称 “SYSIBM”、“SYSFUN”、“SYSPROC”、“SYSIBMADM ”。
- SESSION_USER 或 USER
- 指定SESSION_USER或USER特殊寄存器的值,该值表示一个最多8字节(EBCDIC) 的架构名称。 在处理CREATE语句时,此长度将包含在为PATH绑定选项指定的模式名称列表的总长度中。
- 发布
- 指定何时释放过程使用的资源:在每个提交点或过程结束时。
- COMMIT
- 指定在每个提交点释放资源。
COMMIT是默认值。
- DEALLOCATE
- 指定资源仅在线程终止时释放。 DEALLOCATE对动态SQL语句没有影响,后者总是使用RELEASE AT COMMIT,但以下情况例外:当您使用RELEASE AT DEALLOCATE子句和WITH KEEP DYNAMIC子句时,且子系统在安装面板 DSNTIP8 上为CACHE DYNAMIC SQL字段安装了值为YES的值,则RELEASE AT DEALLOCATE选项适用于动态SELECT和数据更改语句。
在以下任一事件发生时,为动态陈述而购买的锁将被收回:
- 应用程序进程结束。
- 申请流程会生成一份带有相同声明标识符的PREPARE声明。 (在下一个提交点解锁)。
- 由于语句未被使用,因此从动态语句缓存中移除。 (在下一个提交点解锁)。
- 声明所依赖的对象被删除或更改,或者声明所需的特权被撤销。 (在下一个提交点解锁)。
释放 AT DEALLOCATE 可能会增加软件包或计划的大小,因为附加项目会驻留在软件包或计划中。
更多信息,请参阅选择发布选项。
- REOPT
- 指定 Db2 是否将在运行时使用SQL变量或SQL参数、参数标记和特殊寄存器的值来确定访问路径。
- None
- 指定 Db2 不会在运行时通过SQL变量或SQL参数、参数标记和特殊寄存器的值来确定访问路径。
默认值为无。
- ALWAYS
- 指定每次运行SQL语句时, Db2 始终决定运行时的访问路径。 不要在WITH KEEP DYNAMIC或NODEFER PREPARE子句中指定REOPT ALWAYS。
- ONCE
- 指定 Db2 仅在第一次打开动态SQL语句时确定一次访问路径。 这条访问路径一直可用,直到准备好的语句失效或被从动态语句缓存中移除,需要重新准备。
- 查询 加速
- 指定是否对静态SQL查询进行加速,如果是,则指定加速行为。
- 无
- 指定应用程序中的静态SQL查询不会绑定加速,也不会在应用程序运行时加速。
- ENABLE
- 指定静态SQL查询在满足加速条件(包括成本和启发式条件)时进行加速。 当应用程序运行时,查询将发送至加速器。 否则,如果静态查询不符合加速标准,则查询将在 Db2 中执行。
如果在应用程序运行时执行加速静态查询时出现错误情况(例如以下示例中的情况), Db2 将失败,并向应用程序返回负SQL代码:
- 在加速器上运行静态查询时出现故障。
- 查询时,加速器返回错误。
- 加速器未启动, Db2 无法将静态查询路由到加速器执行。
- 启用(带故障恢复)
- 结果与ENABLE 相同,除非在应用程序运行时,加速静态查询首次打开时出现错误条件。 在这种情况下, Db2 不会让静态查询失败并向应用程序返回负面的SQL代码,而是对查询执行临时语句级增量绑定,并在 Db2 中运行查询。 应用程序没有发现加速故障。 当应用程序成功打开加速器查询后,无法再发送电子邮件至 Db2 。
- 合格
- 指定如果静态SQL查询满足基本加速条件,则无论代价或启发式条件如何,都将加速该查询。 当应用程序运行时,查询将发送至加速器。
与ENABLE 的行为一样,如果在应用程序运行时执行加速静态查询时出现错误, Db2 将失败,并向应用程序返回负SQL代码。
- 全部
- 指定应用程序中的所有静态SQL查询在应用程序运行时绑定到加速器并路由到加速器。 如果 Db2 确定静态查询无法绑定到加速器上运行,并且查询引用了用户基础表或视图,则BIND或REBIND PACKAGE操作将失败,并显示该查询的错误消息。 (已声明的全局临时表(DGTT)和已创建的全局临时表(CGTT)除外,因为这些表无法加速。)
与ENABLE 的行为一样,如果在应用程序运行时执行加速静态查询时出现错误, Db2 将失败,并向应用程序返回负SQL代码。
此绑定选项不适用于在例程的 RETURN 语句中指定的 fullselect 或 WITH 共用表表达式 ,也不适用于在例程中使用的 SET 主机变量赋值。 在这种情况下,无法加速查询。
- get_accel_archive
- 指定用于加速的静态SQL查询是否检索加速器上的存档数据,而不是活动数据。
- 否
- 指定不使用静态SQL查询从加速器中检索已归档的数据。 如果静态查询也不需要加速,则查询将在 Db2 中运行。
如果静态查询因指定了QUERYACCELERATION绑定选项而需要加速,则当应用程序运行时,查询将发送到加速器;但是,查询不会检索任何存档数据。
- YES
- 指定如果满足以下所有条件,则查询将加速,并在应用程序运行时检索加速器上的存档数据:
- QUERYACCELERATION绑定选项也已指定。
- 静态SQL查询引用了加速表,该表将分区数据存档在加速器上。
- 静态查询满足QUERYACCELERATION绑定选项指定的加速条件。
如果静态查询不符合QUERYACCELERATION绑定选项指定的加速条件,则绑定或重新绑定程序包操作会失败,并显示该查询的错误消息。
此绑定选项不适用于在例程的 RETURN 语句中指定的 fullselect 或 WITH 共用表表达式 ,也不适用于在例程中使用的 SET 主机变量赋值。 在这种情况下,无法加速查询。
加速度
指定加速器在等待复制 Db2 运行查询之前发生的已提交 Db2 数据更改时延迟查询的最长时间(如果有)。对于静态加速查询,您还必须将此函数或过程的QUERYACCELERATION绑定选项设置为NONE以外的合法值,以请求加速静态查询。 如果QUERYACCELERATION绑定选项值设置为NONE,则ACCELERATIONWAITFORDATA绑定选项将被接受,并且程序包将绑定该选项值;但是,该选项将不适用于静态SQL查询,因为不会加速任何静态查询。
对于动态加速查询,指定加速等待数据绑定选项也会初始化当前查询加速等待数据特殊寄存器,该寄存器用于 Db2 函数或程序中的动态查询,前提是函数或程序选项默认特殊寄存器也被使用。 将当前查询加速等待数据初始化为大于0的值,指定 Db2 和加速器将对所有由 Db2 函数或过程加速的动态SQL查询应用等待数据延迟行为和限制。 当前查询加速特殊寄存器必须具有除“无”以外的其它有效值,才能请求加速动态查询。
- nnnn.m
- 指定一个 DECIMAL(5,1) 数字常量值,该值指定在加速器等待复制在 Db2 运行查询之前发生的已提交 Db2 数据更改时,加速器将延迟查询的最大秒数。
您可以指定一个介于 0.0 到 3600.0 秒之间的值。 例如, 20.0 表示 20.0 秒(或 20000 毫秒),而 30.5 表示 30.5 秒(或 30500 毫秒)。 3600.0 的最大值表示查询延迟了3600秒。
您也可以指定一个介于0-3600秒之间的整数常数值, Db2 会将该值转换为DECIMAL(5,1)值。
重要 :当为 ACCELERATIONWAITFORDATA 绑定选项指定非零值时, Db2 和加速器将对应用程序包加速的所有查询应用其他 WAITFORDATA 延迟行为、限制和要求。 这些行为、限制和要求可能会导致以前成功加速的查询不再加速或失败。 请参阅 SET CURRENT QUERY ACCELERATION WAITFORDATA语句 ,了解有关WAITFORDATA行为、限制和要求的更多信息。
加速器
指定一个加速器服务器,如果该服务器已启用且可用, Db2 会将其视为符合条件的 SQL 查询的首选加速器,然后再将查询发送到其他加速器服务器。 如果指定的加速器服务器未启用或不可用, Db2 将把查询发送到其他可用的加速器服务器。
- 确认运行或 VALIDATE BIND
- 指定是否在运行时重新检查绑定或重新绑定期间发现的“未找到对象”和“未授权”类型的错误。 如果所有对象和所需权限都已存在,则该选项不起作用。
- 验证运行
- 指定当处理CREATE语句时,如果所需对象或权限不存在,则返回警告消息,但CREATE语句成功。 Db2 子系统会在运行时对那些在处理CREATE语句时未能通过检查的SQL语句的对象和权限进行重新检查。 授权检查例程所有者授权ID的使用情况。
默认值为 “验证运行 ”。
- VALIDATE BIND
- 指定如果在处理CREATE语句时所需的对象或权限不存在,则发出错误并导致CREATE语句失败。
- ROUNDING
- 指定处理DECFLOAT数据的舍入模式。 默认值来自DECP中的默认十进制浮点舍入模式。
- DEC_ROUND_CEILING
- 指定数字取整为正无穷大。
- DEC_ROUND_DOWN
- 指定数字四舍五入为0(截断)。
- DEC_ROUND_FLOOR
- 指定数字舍入为负无穷大。
- DEC_ROUND_HALF_DOWN
- 指定数字四舍五入取整;如果等距,则向下取整。
- DEC_ROUND_HALF_EVEN
- 指定数字四舍五入取整;如果等距,则四舍五入取整,使最后一位数字为偶数。
- DEC_ROUND_HALF_UP
- 指定数字四舍五入取整;如果等距,则向上取整。
- DEC_ROUND_UP
- 指定数字舍入到0以外。
- DATE FORMAT ISO, EUR , USA , JIS ,或 LOCAL
- 指定日期或时间值的字符串表示形式结果值的日期格式。 更多信息,请参阅日期时间值的字符串表示。
默认格式在定义例程的系统安装面板 DSNTIP4 的日期格式字段中指定。 除非您有日期退出程序,否则无法使用“本地”选项。
- DECIMAL(15 ) , DECIMAL(31 ) , DECIMAL(15 , s ) ,或 DECIMAL(31 , 秒 )
- 指定十进制算术运算的最大精度。 更多信息请参阅 《两位小数运算的算术 》。 默认格式在定义例程的系统安装面板 DSNTIPF 的 DECIMAL ARITHMETIC 字段中指定。 如果指定了 pp. s 形式, 则 s 必须是 1-9 范围内的数字。s 表示用于除法的最小小数位数。
- FOR UPDATE CLAUSE OPTIONAL 或需要更新条款
- 指定如果游标用于执行定位更新,则DECLARE CURSOR语句是否需要FOR UPDATE子句。
- 需要更新条款
- 规定如果游标将用于定位更新,则必须将FOR UPDATE子句作为游标定义的一部分。
默认情况下, 需要更新条款。
- FOR UPDATE CLAUSE OPTIONAL
- 指定在定位更新中使用游标时,无需指定 FOR UPDATE 子句。 常规主体可以包含定位UPDATE语句,用于更新用户有权限更新的列。
- TIME FORMAT ISO, EUR , USA , JIS ,或 LOCAL
- 指定日期或时间值的字符串表示形式结果值的时间格式。 更多信息,请参阅日期时间值的字符串表示。
默认格式在定义例程的系统安装面板 DSNTIP4 的“时间格式”字段中指定。 除非您有日期退出程序,否则无法使用“本地”选项。
- BUSINESS_TIME SENSITIVE
- 确定静态和动态 SQL 语句中对应用期间临时表的引用是否受 CURRENT TEMPORAL BUSINESS_TIME 特殊寄存器的值影响。
- YES
- 对申请期间临时表的引用受当前临时业务时间特殊寄存器的值的影响。 缺省值是 YES。
- NO
- 对申请期间临时表的引用不受当前临时业务时间特殊寄存器的值的影响。
- SYSTEM_TIME SENSITIVE
- 确定静态和动态 SQL 语句中对系统周期临时表的引用是否受 CURRENT TEMPORAL SYSTEM_TIME 特殊寄存器的值影响。
- YES
- 对系统周期时态表的引用会受CURRENT TEMPORAL SYSTEM_TIME专用寄存器的值影响。 缺省值是 YES。
- NO
- 对系统周期时态表的引用不会受CURRENT TEMPORAL SYSTEM_TIME专用寄存器的值影响。
更多信息,请参阅当前时间系统_时间特殊寄存器。
- ARCHIVE SENSITIVE
- 确定SQL语句中对启用存档的表的引用是否受 SYSIBMADM.GET_ARCHIVE 内置全局变量值的影响。
- YES
- 对启用存档的表的引用受 SYSIBMADM.GET_ARCHIVE 内置全局变量值的影响。 缺省值是 YES。
- NO
- 对启用存档的表的引用不受 SYSIBMADM.GET_ARCHIVE 内置全局变量值的影响。
相关信息请参阅 GET_ARCHIVE内置全局变量
APPLCOMPAT Appcompat-level
指定存储过程正文中静态 SQL 语句的应用程序兼容性级别行为。 如果未指定此选项,则由APPLCOMPAT子系统参数决定行为。可以指定以下应用兼容级别值:
V12R1M5nn

与已识别的 Db2 12 功能级别行为兼容。 例如,
V12R1M510指定与最高可用 Db2 12 功能级别兼容。 必须激活同等或更高的功能级别。
有关每个应用程序兼容性级别中可用的新功能的信息,请参阅 V12R1Mnnn 应用程序兼容性级别。
提示:
对于使用数据服务器客户端或驱动程序访问 Db2 for z/OS® 的应用程序,可能需要额外的程序准备步骤来提高应用程序兼容性级别。 有关详细信息,请参阅为数据服务器客户端和驱动程序设置应用程序兼容性级别。

V12R1
与 Db2 12 功能 500 级的行为兼容。 该值与指定 V12R1M500的结果相同。
- V11R1
- 与 Db2 11 新功能模式的行为兼容。 迁移到 Db2 12 后,此值与指定
V12R1M100具有相同的结果。 欲了解更多信息,请访问 V11R1 应用程序兼容性级别 - V10R1
- 与 DB2® 10 新功能模式的行为兼容。 更多信息,请参阅 V10R1 应用程序兼容性级别。

浓缩语句或浓缩语句中的词汇
FL 500 指定例程中指定字面常量的每条动态 SQL 语句是否作为单独的唯一语句条目缓存在动态语句缓存中,而不是共享缓存中的现有语句。 如果新语句满足共享同一动态语句缓存版本的所有条件,则动态 SQL 语句有资格共享缓存中的现有语句,但新语句指定的一个或多个字面常量必须与缓存语句不同。- 集中陈述 OFF
指定每个动态SQL语句,如果指定一个或多个与同一动态语句的缓存版本不同的常量,则该语句将被缓存为唯一的语句条目。 集中式语句 OFF 是默认的动态语句缓存行为。
- 用文字浓缩语句
指定每个指定文字常量的动态 SQL 语句将共享同一个动态语句的缓存版本,该动态语句也是使用 CONCENTRATE STATEMENTS WITH LITERALS 选项准备的,前提是新的动态语句满足共享缓存语句的所有条件,并且指定的常量可以代替缓存语句中的常量重复使用。

- SQL 常规语句主体
- 指定定义SQL过程主体的语句。 有关本地 SQL 过程支持的 SQL 控制语句的信息,请参阅 SQL 过程语言 (SQL PL)。 如果 SQL过程语句是过程主体中唯一的语句,则该语句不能以分号结尾。
WRAPPED 混淆语句文本
FL 500指定函数的编码定义。 CREATE PROCEDURE语句可以使用WRAP标量函数进行编码。
不得在静态 CREATE 语句或添加或替换现有存储过程版本的 CREATE 语句中指定 WRAPPED。

CREATE PROCEDURE(SQL - 原生)的注释
- 各类手术注意事项
- 有关适用于所有类型过程的注意事项,请参阅 CREATE PROCEDURE语句(概述 )。
- SQL程序中的错误处理
- 您应该考虑在程序主体中每个SQL语句可能出现的例外情况。 任何未在复合语句中使用处理程序处理的异常SQLSTATE都会导致异常SQLSTATE返回给处理程序的调用者。
- 程序版本
FL 507 SQL 存储过程的 CREATE PROCEDURE 语句定义了存储过程的初始版本。 您可以使用ALTER PROCEDURE语句的ADD VERSION子句定义附加版本,或者在过程已经存在的情况下,使用CREATE PROCEDURE语句的OR REPLACE子句和VERSION子句。 您可以使用ALTER PROCEDURE的REPLACE VERSION子句替换版本,或者在过程版本已经存在的情况下,使用OR REPLACE子句和VERSION子句替换CREATE PROCEDURE语句。参数的数据类型、CCSID 规格和字符数据属性(FOR BIT/SBCS/MIXED DATA)必须与当前活动版本中相应参数的属性相同,除非指定了 OR REPLACE 且未指定 VERSION 关键字。
重要提示: 请勿通过指定 VERSION 关键字来创建 Db2 附带程序的附加版本。 仅支持 Db2 提供的版本。 此类例程的其他版本会导致所提供例程的安装和配置失败。
使用 TABLE LIKE name AS LOCATOR 子句定义现有存储过程时的注意事项
FL 507如果使用表参数定义了现有本地 SQL 存储过程(在原始 CREATE PROCEDURE 语句中指定了 TABLE LIKE name AS LOCATOR 子句,以指示其中一个参数是过渡表),则不能使用 CREATE PROCEDURE 语句更改存储过程,以添加或替换存储过程的版本。 在这种情况下,必须删除程序并重新创建。
- 为程序生成的包的特征
- 与程序第一版相关的包的命名如下:
- location 设置为 CURRENT SERVER 特殊寄存器的值
- 包的collection-id (模式)与过程的模式限定符相同。
- package-id 与特定程序的名称相同
- version-id 与初始版本的程序版本标识符相同。
如果您想更改包名称的集合标识 ,则需要复制包。
使用与隐式或显式指定的过程选项相对应的绑定选项生成包。 更多信息,请参阅 “程序选项与绑定选项的对应关系 ”表格。 除了相应的绑定选项外,该包还使用以下绑定选项生成:
- dbprotocol(drda)
- FLAG(1)
- sqlerror(nopackage)
- 启用(*)
- 程序选项与绑定选项的对应关系
下表列出了特定CREATE PROCEDURE和ALTER PROCEDURE选项的相应绑定命令选项。 有关绑定选项的更多信息,请参阅软件包、计划和服务中的绑定和重新绑定选项。
程序选项与绑定选项的对应关系CREATE PROCEDURE或ALTER PROCEDURE选项 绑定命令选项
加速度 nnnn.m
accelerationwaitfordata( nnnn.m )
加速器加速器名称
加速器(加速器名称)
应用编码方案 ASCII 编码(ASCII) 应用编码方案 EBCDIC ENCODING(EBCDIC) 应用程序编码方案 UNICODE 编码(统一码) 档案 敏感 不 档案敏感(否) 档案 敏感 是 档案敏感(是) 业务时间敏感 不 对时间敏感(否) 业务时间敏感 是 对时间敏感(是) 当前数据 无 当前数据(否) 当前数据 是 当前数据(是) 推迟 准备 推迟(准备) 不服从 准备 不服从(准备) 1级 程度(1) 任何学位 学位(任意) 动态规则运行 动态规则(运行) 动态规则绑定 DYNAMICRULES(BIND) 动态规则 定义绑定 动态规则(定义绑定) 动态规则 定义 运行 动态规则(定义运行) 动态规则 调用绑定 动态规则(调用绑定) 动态规则调用运行 动态规则(调用运行) get_accel_archive 没有 获取加速档案(否) 获取加速档案 是 获取加速档案(是) 隔离等级 CS 绝缘(CS) 隔离等级 RS 隔离(RS) 隔离等级 RR 隔离(RR) 隔离等级 UR 隔离(UR) OPTHINT 字符串常量 OPTHINT (提示-ID ) 包裹所有者授权-姓名 所有者 (授权ID ) 限定符 schema-name 限定词 (限定词名称 ) 查询 加速 无 查询加速(无) 查询 加速 启用 查询加速(启用) 查询加速启用,带故障恢复功能 查询加速(启用回退功能) 查询 加速 合格 查询加速(符合条件的) 查询 加速 全部 查询加速(全部) 发布承诺 发布(提交) 释放于DEALLOCATE 释放(解除分配) 永远重启 REOPT(ALWAYS) 重新选择 无 REOPT(NONE) 重新选择一次 REOPT(ONCE) 四舍五入 DEC_ROUND_CEILING 四舍五入(上限) 四舍五入 DEC_ROUND_DOWN 四舍五入 四舍五入 DEC_ROUNDING_FLOOR 四舍五入(取整) 四舍五入 DEC_ROUNDING_HALF_DOWN 舍入(向下取整) 舍入 DEC_ROUNDING_HALF_EVEN 四舍五入(HALFEVEN) 四舍五入 DEC_ROUNDING_HALF_UP 四舍五入(半) 四舍五入 DEC_ROUNDING_UP 四舍五入 SQL PATH 路径说明 路径 (路径说明 ) 系统时间敏感 不 系统敏感(否) 系统时间敏感 是 系统灵敏度(是) 确认绑定 确认(绑定) 验证运行 确认(运行) 附带解释 解释(是) 无需解释 解释(否) 立即写 立即执行(是) 无需立即撰写 即时写入(否) 保持动态 保持动力(是) 无保持动力 保持动力(否) - 程序对象的应用兼容性级别注意事项
- 应用程序兼容性级别控制着新功能和增强功能的采用和使用。 当一个对象被创建或修改时,会使用两个单独的应用程序兼容级别:一个用于处理对象的定义,另一个用于处理对象正文中的SQL语句:
对象定义 当前应用程序兼容性特殊寄存器值用于处理对象定义,但对象主体中的语句除外
此应用程序兼容性级别存储在 SYSENVIRONMENT.APPLCOMPAT 列中。 您可以在对象的目录定义中使用环境ID值来定位具有匹配ENVID值的SYSENVIRONMENT行。
当对象被重新生成时,应用程序兼容性级别可以更改。
物体主体中的陈述 CREATE或ALTER语句的APPLCOMPAT选项隐式或显式指定的应用程序兼容性级别用于处理对象主体中的语句。
此应用程序兼容性级别存储在与对象定义关联的软件包的 SYSPACKAGE.APPLCOMPAT 列中。
- SQL处理器程序的注意事项
- SQL处理器程序(如SPUFI、 Db2 command line processor 和 DSNTEP2 )可能无法正确解析CREATE PROCEDURE语句常规主体中以分号结尾的SQL语句。 这些处理器程序接受多个SQL语句作为输入,每个语句用终止符分隔。 使用分号作为SQL语句终止符的处理器程序可能会截断带有嵌入分号的CREATE PROCEDURE语句,仅将其中一部分传递给 Db2。 因此,您可能需要为这些处理器程序更改 SQL 终止符。 更多信息,请参阅 《在SPUFI输入数据集中设置SQL终止符 》以及 DSNTEP2 和 DSNTEP4 示例程序中的SQLTERM。
- 识别码解析
- 有关在 SQL 例程中如何将名称解析为列、变量或 SQL 参数的信息,请参阅 SQL 过程语言 (SQL PL)。
如果列、变量和参数使用了重复的名称,请使用列的表名、参数的例程名、SQL变量的标签名和全局变量的模式名来限定重复的名称。
- SQL 过程定义中的行
- 创建SQL过程时,信息会保留在CREATE语句的行中。 线条由新的线条控制字符决定。
- 存储过程,其中参数定义为数组类型
- 定义为数组类型的参数(非数组全局变量)的程序只能从SQL PL上下文或使用 IBM® Data Server Driver for JDBC and SQLJ 类型4连接的Java™应用程序中调用,除非CALL语句中的相应参数为数组全局变量。 如果CALL语句中的相应参数是一个数组全局变量,则可以在SQL PL上下文之外调用该过程。
混淆视听的发言
本地 SQL 存储过程的 CREATE PROCEDURE 语句可以以混淆形式执行。 在一段晦涩难懂的语句中,只有过程名称、参数和WRAPPED关键字可以读出。 该语句的其余部分将以不可读方式进行编码,但支持模糊语句的数据库服务器可以解码该部分。 WRAP标量函数生成混淆语句。 根据混淆语句创建函数时指定的任何调试选项都将被忽略。
- 兼容性
- 为了与 Db2 的早期版本兼容,可以指定以下条款,但它们将被忽略并发出警告:
- STAY RESIDENT
- PROGRAM TYPE
- 运行选项
- NO DBINFO
- 碰撞或未碰撞
- 安全
- PARAMETER STYLE GENERAL WITH NULLS
- 系统默认故障后停止
- 在nn次失败后停止
- 失败后继续
- 参数 VARCHAR
如果指定了FENCED或EXTERNAL子句,则将生成外部SQL过程。 更多信息,请参阅 CREATE PROCEDURE 语句(SQL - 外部存储过程)(已废弃)。
如果指定了 WLM ENVIRONMENT,但没有指定 FOR DEBUG MODE 关键字,则返回错误。 如果本地 SQL 过程指定了 WLM ENVIRONMENT,则必须指定 WLM ENVIRONMENT FOR DEBUG MODE。
- 其他语法和同义词
- 为了与 Db2 的早期版本或 Db2 系列中的其他产品兼容, Db2 支持以下替代语法:
- 结果集和结果集作为动态结果集的同义词
- VARIANT作为“非确定性”的同义词
- NOT VARIANT 并非“确定性”的同义词
- NULL CALL作为CALLED ON NULL的同义词
CREATE PROCEDURE(SQL - 原生)示例
- 示例 1
创建SQL过程的定义。 该程序接受员工编号和加薪倍数作为输入。 在程序主体中执行以下任务:
- 计算员工的新工资。
- 用新的工资值更新员工表。
CREATE PROCEDURE UPDATE_SALARY_1 (IN EMPLOYEE_NUMBER CHAR(10), IN RATE DECIMAL(6,2)) LANGUAGE SQL MODIFIES SQL DATA UPDATE EMP SET SALARY = SALARY * RATE WHERE EMPNO = EMPLOYEE_NUMBER- 示例 2
为示例1中描述的SQL过程创建定义,但指定该过程具有以下特征:
- 同样的输入总是产生同样的输出。
- SQL工作将在返回给调用者时完成。
CREATE PROCEDURE UPDATE_SALARY_1 (IN EMPLOYEE_NUMBER CHAR(10), IN RATE DECIMAL(6,2)) LANGUAGE SQL MODIFIES SQL DATA DETERMINISTIC COMMIT ON RETURN YES UPDATE EMP SET SALARY = SALARY * RATE WHERE EMPNO = EMPLOYEE_NUMBER- 示例 3:
- 创建一个SQL过程的定义,该过程使用数组作为IN和OUT参数。 该程序名为GETWEEKENDS。 它接受一系列日期值作为输入,并返回一个仅包含周六或周日日期的数组。 例如,如果输入的日期是周六、周五和周日,则程序仅返回周六和周日的日期。
假设已定义了以下用户定义的数组类型:
CREATE TYPE DATEARRAY AS DATE ARRAY[100];创建数组类型后,任何引用都需要指定完全限定用户定义的数组类型名称。 否则,该类型的方案需要位于当前路径中。
假设SQL过程定义如下:
CREATE PROCEDURE GETWEEKENDS(IN MYDATES DATEARRAY, OUT WEEKENDS DATEARRAY) BEGIN -- ARRAY INDEX VARIABLES DECLARE DATEINDEX, WEEKENDINDEX INT DEFAULT 1; -- VARIABLE TO STORE THE ARRAY LENGTH OF MYDATES, -- INITIALIZED USING THE CARDINALITY FUNCTION. DECLARE DATESCOUNT INT; SET DATESCOUNT = CARDINALITY(MYDATES); -- FOR EACH DATE IN MYDATES, IF THE DATE IS A SUNDAY OR SATURDAY, -- ADD IT TO THE OUTPUT ARRAY NAMED "WEEKENDS" WHILE DATEINDEX <= DATESCOUNT DO IF DAYOFWEEK(MYDATES[DATEINDEX]) IN (1, 7) THEN SET WEEKENDS[WEEKENDINDEX] = MYDATES[DATEINDEX]; SET WEEKENDINDEX = WEEKENDINDEX + 1; END IF; SET DATEINDEX = DATEINDEX + 1; END WHILE; END假设输入数组MYDATES包含以下内容:
['2012-04-28', '2012-02-10','2012-03-18']在程序返回后,输出数组WEEKENDS包含以下内容:
['2012-04-28', '2012-03-18'] - 示例 4
- 创建一个使用数组作为输出参数的SQL过程的定义。 该过程名为GET_PHONES。 它返回一个包含员工1775的电话号码的数组。 如果员工有五个以上的电话号码,则返回错误,因为数组仅定义了五个元素。
假设已定义了以下用户定义的数组类型和表:
CREATE TYPE PHONELIST AS DECIMAL(10, 0) ARRAY[5]; CREATE TABLE EMP_PHONES(ID INTEGER, PHONENUMBER DECIMAL(10,0));SQL过程定义如下:
CREATE PROCEDURE GET_PHONES(OUT EPHONES PHONELIST) BEGIN SELECT ARRAY_AGG(PHONENUMBER) INTO EPHONES FROM EMP_PHONES WHERE ID = 1775; END
有关 SQL 程序的更多示例,请参阅 SQL 程序语言 (SQL PL)。
