如何在 DB2 存储过程中使用 SET OPTION

How to use SET OPTION within a DB2 stored procedure

我读到(并尝试过)我不能在 DB2 存储过程中使用 WITH UR。有人告诉我,我可以使用 SET OPTION 来达到相同的目的。但是,当我在我的存储过程中实现它时,它无法编译(我在它的位置周围移动同样的错误)。我的问题是:

这是我的代码的简化版本:

    CREATE OR REPLACE PROCEDURE MySchema.MySampleProcedure()
        DYNAMIC RESULT SETS 1 
        LANGUAGE SQL 
        SET OPTION COMMIT=*CHG 
        
        BEGIN
             DECLARE GLOBAL TEMPORARY TABLE TEMP_TABLE AS (
             SELECT 'testValue' as "Col Name"
             ) WITH DATA
        

        BEGIN
             DECLARE  exitCursor CURSOR WITH RETURN FOR
             SELECT *
             FROM SESSION.TEMP_TABLE;
             OPEN exitCursor;
        END;

        END 
        @

Error Message: 

SQL0104N An unexpected token "SET OPTION COMMIT=*CHG" was found following " LANGUAGE SQL

这是 code/error 当我使用 WITH UR

CREATE OR REPLACE PROCEDURE MySchema.MySampleProcedure()

    LANGUAGE SQL 
    DYNAMIC RESULT SETS 1 

--#SET TERMINATOR @
BEGIN

    DECLARE GLOBAL TEMPORARY TABLE TEMP_TABLE AS (
        SELECT UTI AS "Trade ID" FROM XYZ WITH UR
        ) WITH DATA;

    BEGIN
        DECLARE  exitCursor CURSOR WITH RETURN FOR
            SELECT *
            FROM SESSION.TEMP_TABLE;
        OPEN exitCursor;
    END;

END
@

第 9 行是 DECLARE GLOBAL TEMPORARY ...

DB21034E The command was processed as an SQL statement because it was not a valid Command Line Processor command. During SQL processing it returned: SQL0109N The statement or command was not processed because the following clause is not supported in the context where it is used: "WITH ISOLATION USE AND KEEP". LINE NUMBER=9. SQLSTATE=42601

如果您的 Db2 服务器在 Linux/Unix/Windows (Db2-LUW) 上运行,则没有 SET OPTION COMMIT=*CHG 这样的语句,因此 Db2 将针对该无效语法抛出异常。

重要的是使用与您的 Db2 平台和 Db2 版本相匹配的 Db2 知识中心。不要将 Db2-Z/OS 文档用于 Db2-LUW 开发。语法和功能因平台和版本而异。

Db2-LUW SQL PL 过程可以在其内部查询中使用 with ur,如果出现错误,则说明其他地方出了问题。但是,您必须以正确的语法使用 with ur,即在支持此子句的语句中。对于您的示例,您会收到错误,因为该子句在描述的上下文中似乎无效。您可以通过其他方式获得所需的结果,其中之一是在与声明分开的语句中填充 table(例如 insert into session.temp_table("Trade ID") select uti from xyz with ur; ),其他方式也是可能的。

使用在线 Db2 Knowledge Cenbtre 文档的一个原因是它包含样本程序,包括样本 SQL PL 过程,这些程序也可以在您的 sample 目录中以源代码形式获得DB2-LUW 服务器,此外在 github 上可用。学习这些,让它们为你所用是明智的。

Specifying the isolation level:

For static SQL:

  • If an isolation-clause is specified in the statement, the value of that clause is used.
  • If an isolation-clause is not specified in the statement, the isolation level that was specified for the package when the package was bound to the database is used.

您需要将例程包与 UR 绑定,因为您的 DECLARE GTT 语句是静态的。在 CREATE OR REPLACE 之前,在同一会话中使用以下内容:

CALL SET_ROUTINE_OPTS('ISOLATION UR')

P.S.: 如果您希望 运行 您的例程不仅在同一会话中出现 1 次而没有错误,请使用 DECLARE 的附加 WITH REPLACE 选项。