SET CURRENT PACKAGE PATH 语句
SET CURRENT PACKAGE PATH 语句可为 CURRENT PACKAGE PATH 专用寄存器分配值。
调用 SET CURRENT PACKAGE PATH
此声明只能嵌入应用程序中。 这是一个无法动态准备的可执行语句。
授权 SET CURRENT PACKAGE PATH
不需要执行任何操作。
语法 SET CURRENT PACKAGE PATH
描述 SET CURRENT PACKAGE PATH
当前包路径的值被指定的值所取代。
- 收藏-ID
- 标识一个集合。 collection-id 不能是空值或仅包含空格的分隔标识符。
- SESSION_USER 或 USER
- 指定 SESSION_USER(USER)特殊寄存器的值。
- CURRENT PACKAGE PATH
- 在执行SET CURRENT PACKAGE PATH语句之前,指定CURRENT PACKAGE PATH特殊寄存器的值。
- CURRENT PATH
- 指定当前路径特殊寄存器的值。
- variable
- 指定一个包含一个或多个集合ID的主变量,以逗号分隔。 变量必须
- 数据类型为CHAR或VARCHAR。 宿主变量内容的实际长度不得超过当前包路径特殊寄存器的最大长度。
- 如果提供了指标变量,则不能为空值。
- 包含一个空字符串或空白字符串,或一个或多个以逗号分隔的集合ID。
- 如果宿主变量是固定长度的,或者宿主变量的实际长度比内容长,则在右侧用空格填充。
- 不包含空值或仅包含空格的分隔标识符。
- 字符串常量
- 指定一个包含一个或多个集合ID的字符串常量,以逗号分隔。 该字符串常量必须:
- 长度不超过 CURRENT PACKAGE PATH 专用寄存器的最大长度。
- 包含一个空字符串或空白字符串,或一个或多个以逗号分隔的集合ID。
- 不包含空值或仅包含空格的分隔标识符。
当前软件包路径的备注
- 变量或字符串常量的内容
如果变量或字符串常量的值至少包含一个逗号,则其内容会被解释为集合 ID 列表。 如果指定了多个收藏ID,则必须用逗号隔开。 列表中的每个集合ID必须符合普通标识符的规则,或者被指定为分隔标识符。
- 检查是否存在收藏
在设置 CURRENT PACKAGE PATH(当前软件包路径)特殊寄存器时,并不验证这些软件包是否存在。 例如,拼写错误的集合ID不会被检测到,这可能会影响后续SQL的操作方式。 在软件包执行时,会检查对特定软件包的授权,如果授权检查失败,就会出错。
- 特殊寄存器的结果内容
建立特殊寄存器字符串的方法是:将指定的每个集合 ID 去掉尾部空白,用双引号分隔,必要时将集合 ID 中的双引号加倍,然后用逗号分隔每个集合 ID。 如果同一收藏集ID在列表中出现多次,则使用首次出现的收藏集,并发出警告。 生成的列表长度不能超过特殊寄存器的长度。 例如,假设发布了以下声明:
SET CURRENT PACKAGE PATH = MYPKGS, "ABC E", SYSIBM SET :HVPKLIST = CURRENT PACKAGE PATH这些语句将宿主变量的值设置为:“MYPKGS”、“ABC E”、“SYSIBM”。
不符合普通标识符规则的集合 ID 必须指定为带分隔符的集合 ID,且不得在变量或字符串常量中指定。
- 考虑关键词
将 SESSION_USER 等单个关键字指定为单个关键字或指定为带分隔符的标识符之间存在差异。 为了表示在包路径中应该使用指定为单个关键字的特殊寄存器的当前值,请将特殊寄存器的名称指定为关键字。 如果您将特殊寄存器的名称指定为分隔标识符,则将其解释为该值的集合ID。 例如,假设SESSION_USER特殊寄存器的当前值为SMITH,并发出以下语句:
SET CURRENT PACKAGE PATH = SYSIBM, SESSION_USER, "USER"结果,CURRENT PACKAGE PATH特殊寄存器的值被设置为:“SYSIBM”、“SMITH”、“USER”。
- 在 SQL 存储过程中指定集合 ID
- Db2 使用以下规则来确定 SET PACKAGE PATH = name 语句中指定的值是变量还是集合 ID:
- 如果名称与SQL程序中的参数或SQL变量相同,则 Db2 会将名称用作参数或SQL变量,并将名称中的值分配给程序包路径。
- 如果名称与SQL程序中的参数或SQL变量不同, Db2 将名称用作集合ID,并将名称中的值作为程序包路径。
- DRDA 分类
- SET CURRENT PACKAGE PATH 语句由数据库服务器执行,因此在 DRDA 中被归类为非本地 SET 语句。 SET CURRENT PACKAGE PATH语句需要DRDA提供更高水平的支持。 如果连接到本地服务器时发出SET CURRENT PACKAGE PATH命令,则本地服务器的SET CURRENT PACKAGE PATH特殊寄存器将被设置。 否则,当连接到远程服务器时发出SET CURRENT PACKAGE PATH命令,远程服务器的SET CURRENT PACKAGE PATH特殊寄存器将被设置。
例子 SET CURRENT PACKAGE PATH
将 CURRENT PACKAGE PATH(当前软件包路径)特殊寄存器设置为 COLL4 和 COLL5 的集合列表,其中 :hvar1 包含值 COLL4,COLL5:
SET CURRENT PACKAGE PATH :hvar1;当前数据包路径的值被设置为以下两个集合ID:" COLL4 "和" COLL5 "。
将 CURRENT PACKAGE PATH 特殊寄存器设置为集合列表: COLL1, COLL#2, COLL3, COLL4, 和 COLL5, 其中 :hvar1 包含值 COLL4,COLL5:
SET CURRENT PACKAGE PATH = "COLL1","COLL#2","COLL3", :hvar1;当前数据包路径的值设置为以下五个集合ID:“ COLL1 ”、“ COLL#2 ”、“ COLL3 ”、“ COLL4 ”和“ COLL5 ”。
清除当前包路径(CURRENT PACKAGE PATH)特殊寄存器。
SET CURRENT PACKAGE PATH = ' ';在准备调用名为 SUMARIZE 的存储过程时,将两个集合 COLL_PROD1 " 和 " COLL_PROD2 暂时添加到 CURRENT PACKAGE PATH 特殊寄存器的末尾。 集合的值分别保存在主机变量 :prodcoll1 和 :prodcoll2 中。 由于存储过程SUMARIZE未定义COLLID值,而是定义了INHERIT SPECIAL REGISTERS,因此该存储过程将继承CURRENT PACKAGE PATH的值。 当存储过程返回时,将特殊寄存器 CURRENT PACKAGE PATH 的值恢复为原始值。
SET :oldCPP = CURRENT PACKAGE PATH; SET CURRENT PACKAGE PATH = CURRENT PACKAGE PATH, :prodcoll1, :prodcoll2; CALL SUMARIZE(:V1,:V2); SET CURRENT PACKAGE PATH = :oldCPP;
