为编译型 SQL 对象定制预编译和绑定选项
SQL 过程、编译型函数、编译型触发器及复合 SQL(编译型)语句的预编译和绑定选项可通过 Db2® 注册表变量或一些 SQL 过程例程进行定制。
关于此任务
要为编译型 SQL 对象定制预编译和绑定选项,请设置实例范围的
Db2 注册表变量 DB2_SQLROUTINE_PREPOPTS。例如:
db2set DB2_SQLROUTINE_PREPOPTS=options可使用 SET_ROUTINE_OPTS 存储过程在过程级别更改这些选项。在当前会话中为创建 SQL 过程而设置的选项的值可通过 GET_ROUTINE_OPTS 函数获取。
用于编译给定例程的选项存储在系统目录表 ROUTINES.PRECOMPILE_OPTIONS 内对应该例程的行中。如果该例程重新生效,那么还会在例程重新生效期间使用这些已存储选项。
创建例程后,可使用 SYSPROC.ALTER_ROUTINE_PACKAGE 和 SYSPROC.REBIND_ROUTINE_PACKAGE 过程来改变编译选项。改变后的选项反映在 ROUTINES_PRECOMPILE_OPTIONS 系统目录表中。
注: 在 SQL 过程中对 FETCH 语句中引用的游标和 FOR 语句中的隐式游标禁用了游标分块。不管对 BLOCKING
绑定选项指定的值如何,将以优化高效方式检索数据(一次一行)。
示例
在此示例中使用的 SQL 过程将在以下 CLP 脚本中定义。这些脚本不在 sqlpl 样本目录中,但可通过将 CREATE 过程语句复制并粘贴到您自己的文件中来轻松创建这些文件。
这些样本使用表 expenses,可按如下所示在样本数据库中创建该表:
db2 connect to sample
db2 CREATE TABLE expenses(amount DOUBLE, date DATE)
db2 connect reset开始时指定使用日期的 ISO 格式作为实例范围设置:
db2set DB2_SQLROUTINE_PREPOPTS="DATETIME ISO"
db2stop
db2start
必须停止然后重新启动 Db2 实例才能使更改生效。然后连接至数据库:
db2 connect to sample按如下所示在
CLP 脚本 maxamount.db2 中定义第一个过程:
CREATE PROCEDURE maxamount(OUT maxamnt DOUBLE)
BEGIN
SELECT max(amount) INTO maxamnt FROM expenses;
END @ 它将使用选项 DATETIME
ISO 和 ISOLATION UR 创建: db2 "CALL SET_ROUTINE_OPTS(GET_ROUTINE_OPTS() || ' ISOLATION UR')"
db2 -td@ -vf maxamount.db2按如下所示在 CLP 脚本
fullamount.db2 中定义下一个过程:
CREATE PROCEDURE fullamount(OUT fullamnt DOUBLE)
BEGIN
SELECT sum(amount) INTO fullamnt FROM expenses;
END @ 它将使用选项 ISOLATION
CS 创建(请注意,在此情况下,未使用实例范围的 DATETIME
ISO 设置): CALL SET_ROUTINE_OPTS('ISOLATION CS')
db2 -td@ -vf fullamount.db2按如下方式在 CLP 脚本 perday.db2
中定义示例中的最后一个过程:
CREATE PROCEDURE perday()
BEGIN
DECLARE cur1 CURSOR WITH RETURN FOR
SELECT date, sum(amount)
FROM expenses
GROUP BY date;
OPEN cur1;
END @ 最后一个 SET_ROUTINE_OPTS 调用使用 NULL 值作为自变量。这会复原
DB2_SQLROUTINE_PREPOPTS 注册表中指定的全局设置,所以最后一个过程将使用选项 DATETIME ISO 创建: CALL SET_ROUTINE_OPTS(NULL)
db2 -td@ -vf perday.db2