为编译型 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 ISOISOLATION 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