ASSOCIATE LOCATORS 语句
ASSOCIATE LOCATORS语句为存储过程返回的每个结果集获取结果集定位符值。
调用 ASSOCIATE LOCATORS
此语句可嵌入应用程序中。 它是可动态准备的可执行语句。 它不能以交互方式发布。
授权 ASSOCIATE LOCATORS
不需要执行任何操作。
语法 ASSOCIATE LOCATORS
描述 ASSOCIATE LOCATORS
- rs-locator-variable
- 标识根据结果集定位变量声明规则声明的结果集定位变量。
- 使用过程 procedure-name 或 宿主变量
- 标识返回一个或多个结果集的存储过程。 当执行“关联定位器”语句时,过程名称必须标识请求者已经使用 SQL CALL 语句调用的存储过程。 过程名称可以指定为单部分、双部分或三部分名称。 ASSOCIATE LOCATORS 语句中过程名称的指定方式必须与 CALL 语句中指定的方式相同。 例如,如果在CALL语句中指定了由两部分组成的程序名称,则必须在ASSOCIATE LOCATORS语句中指定由两部分组成的程序名称。
如果使用宿主变量来指定名称:
- 它必须是一个字符串变量,长度属性不能超过255。
- 其后不能跟指示变量。
- 宿主变量的值取决于服务器。 无论使用何种服务器,规格必须:
- 在宿主变量中左对齐
- 不包含嵌入的空格
- 如果右边的长度小于宿主变量的长度,则用空白填充
备注 ASSOCIATE LOCATORS
定位器值的分配 :如果关联定位器语句指定了多个定位器变量,则定位器值将按照关联游标的打开顺序分配给定位器变量,而不管它们在运行时是否仍然打开。 定位器值按照在DESCRIBE PROCEDURE语句中SQLDA中SQLVAR条目中的相同顺序分配给定位器变量。
当控制权返回调用应用程序时,不向关闭的游标提供定位器值。 如果光标被关闭,然后在返回调用应用程序之前再次打开,则使用光标最近执行的 OPEN CURSOR 语句来确定为过程结果集返回定位器值的顺序。 例如,假设程序 P1 打开三个游标A、B、C,关闭游标B,然后在返回调用应用程序之前为游标B发出另一个OPEN CURSOR语句。 为以下关联定位器语句指定的定位器值将按A、C、B的顺序排列:
ASSOCIATE RESULT SET LOCATORS (:loc1, :loc2, :loc3) WITH PROCEDURE P1;
-- assigns locators for result set cursors A, C, and B一个结果集可以关联多个定位器。 您可以为同一个存储过程发布多个关联定位器语句,使用不同的结果集定位器变量将多个定位器与每个结果集关联起来。
- 如果在关联定位器语句中指定的结果集定位器变量数量少于存储过程返回的结果集数量,则语句中指定的所有定位器变量都会分配一个值,并发出警告。 例如,假设过程 P1 存在并返回四个结果集。 以下每个关联定位器语句都会返回第一个结果集的信息,并警告没有提供足够的定位器来获取所有结果集的信息。
CALL P1; ASSOCIATE RESULT SET LOCATORS (:loc1) WITH PROCEDURE P1; -- :loc1 is assigned a value for first result set, and a warning is returned ASSOCIATE RESULT SET LOCATORS (:loc2) WITH PROCEDURE P1; -- :loc2 is assigned a value for first result set, and a warning is returned ASSOCIATE RESULT SET LOCATORS (:loc3) WITH PROCEDURE P1; -- :loc3 is assigned a value for first result set, and a warning is returned ASSOCIATE RESULT SET LOCATORS (:loc4) WITH PROCEDURE P1; -- :loc4 is assigned a value for first result set, and a warning is returned - 如果关联定位器语句中列出的结果集定位器变量的数量大于存储过程返回的定位器数量,则多余的定位器变量会被赋值为0。
从多个CALL语句访问结果集 :应用程序可以访问由多个CALL语句创建的结果集。 结果集可以通过不同的过程创建,也可以通过多次调用相同的过程创建。
- 调用不同的程序 :调用同名但不同程序的两种方式:一种是明确指定不同的集合,另一种是隐式使用 PACKAGE PATH。 例如,为了明确识别不同的集合,请在CALL语句中指定限定名称。 虽然这两个过程都叫做 P2 ,但它们是不同的过程。 在第二个CALL语句之后,应用程序可以访问两个过程的结果集。
CALL X.P2; CALL Y.P2;当在CALL语句中指定了非限定过程名称时,也可以从包路径中隐式确定两种不同过程的集合。 例如,假设程序 P4 存在于集合X和Z中。 一个应用程序包含两个调用过程 P4 的CALL语句。 CALL语句中 P4 的引用没有限定条件。 因此,程序名称通过特殊寄存器 PACKAGE PATH 进行解析。 第一个CALL语句调用过程 X.P4 ,第二个CALL语句调用过程 Z.P4。 在第二个CALL语句之后,应用程序可以访问两个过程的结果集。SET CURRENT PACKAGE PATH = X, Y, Z; CALL P4; SET CURRENT PACKAGE PATH = PATH Z, Y, X; CALL P4; - 多次调用同一个存储过程 :如果服务器和请求者的版本都是相同的 Db2 ,则可以在应用程序中调用同一个存储过程,且调用次数不受限制。 每次调用同一个存储过程时,都会运行一个唯一的存储过程实例。 如果存储过程返回结果集,则存储过程的每个实例都会打开自己的结果集游标集。 有关此情况的更多信息,请参见 “多次调用同一个存储过程 ”。当在应用程序中多次调用一个过程,并且需要同时处理来自不同实例的结果集时,请务必在每个CALL语句后使用ASSOCIATE LOCATORS语句来捕获每次调用过程返回的定位器值。 例如,假设过程P存在于集合Z中,并且应用程序包含两个调用过程P的CALL语句。PACKAGE PATH用于确定第一个CALL语句中过程的集合,该集合在第二个CALL语句中明确指定。 如果第一次CALL语句产生的结果集定位符在第二次调用该过程之前通过ASSOCIATE LOCATOR语句捕获,则应用程序可以在两次CALL语句之后访问这两个过程的结果集。
SET CURRENT PACKAGE PATH = X, Y, Z; CALL P3; ASSOCIATE LOCATORS ... CALL Z.P3; ASSOCIATE LOCATORS ... -- process the result sets using the locators
使用宿主变量 :如果关联定位器语句包含宿主变量,则适用以下条件:
- 如果静态执行语句,则假定宿主变量的内容采用绑定包含该语句的程序包或计划时在 ENCODING 参数中指定的编码方案。
- 如果语句是动态执行的,则假定宿主变量的内容采用应用程序编码绑定选项中指定的编码方案。
例子 ASSOCIATE LOCATORS
以下示例中的语句假定是在PL/I程序中。
示例1 :使用结果集定位变量 LOC1 和 LOC2 获取存储过程 P1 返回的两个结果集的定位值。 假设当前服务器 SITE2 以单部分名称调用存储过程。
EXEC SQL CONNECT TO SITE2;
EXEC SQL CALL P1;
EXEC SQL ASSOCIATE RESULT SET LOCATORS (:LOC1, :LOC2)
WITH PROCEDURE P1;示例2 :重复示例1中的场景,但使用一个由两部分组成的名称来指定存储过程的显式模式名称,以确保使用模式MYSCHEMA中的存储过程 P1。
EXEC SQL CONNECT TO SITE2;
EXEC SQL CALL MYSCHEMA.P1;
EXEC SQL ASSOCIATE RESULT SET LOCATORS (:LOC1, :LOC2)
WITH PROCEDURE MYSCHEMA.P1;示例3 :使用结果集定位变量 LOC1 和 LOC2 获取由名为 HV1 的主变量存储过程返回的两个结果集的结果集定位值。 假设宿主变量 HV1 包含值 SITE2.MYSCHEMA.P1 ,并且存储过程以三部分名称调用。
EXEC SQL CALL SITE2.MYSCHEMA.P1;
EXEC SQL ASSOCIATE LOCATORS (:LOC1, :LOC2)
WITH PROCEDURE :HV1;如果宿主变量 HV1 包含 MYSCHEMA.P1 (一个由两部分组成的名称)的值,则前面的示例将无效。 为了使主机变量 HV1 中的两部分名称有效,当前服务器必须与CALL语句中指定的位置名称相同,如下面的语句所示。 这是唯一不需要指定相同名称的情况,在CALL语句中使用三部分名称,在关联定位符语句中使用两部分名称。
EXEC SQL CONNECT TO SITE2;
EXEC SQL CALL SITE2.MYSCHEMA.P1;
EXEC SQL ASSOCIATE LOCATORS (:LOC1, :LOC2)
WITH PROCEDURE :HV1;