首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在DB2存储过程中使用SET选项

如何在DB2存储过程中使用SET选项
EN

Stack Overflow用户
提问于 2021-03-02 13:20:19
回答 2查看 623关注 0票数 0

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

  • 在过程中的SELECT语句之后,我真的不能用UR吗?
  • 为什么我的存储过程无法使用下面的错误消息进行编译?

下面是我的代码的简化版本:

代码语言:javascript
复制
    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一个意外的标记"SET选项COMMIT=*CHG“出现在”LANGUAGE SQL“之后。

下面是在UR中使用时的代码/错误

代码语言:javascript
复制
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行是声明全局临时..。是

DB21034E命令作为SQL语句处理,因为它不是有效的命令行处理器命令。在SQL处理过程中,它返回: SQL0109N语句或命令没有被处理,因为在使用它的上下文中不支持以下子句:"WITH隔离、使用和保留“。线NUMBER=9. SQLSTATE=42601

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-02 16:24:09

指定隔离级别

对于静态SQL:

  • 如果在语句中指定了隔离子句,则使用该子句的值。
  • 如果语句中没有指定隔离子句,则使用包绑定到数据库时为包指定的隔离级别。

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

代码语言:javascript
复制
CALL SET_ROUTINE_OPTS('ISOLATION UR')

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

票数 1
EN

Stack Overflow用户

发布于 2021-03-02 13:42:10

如果您的Db2服务器在Linux/Unix/Windows (DB2LUW)上运行,那么就没有SET OPTION COMMIT=*CHG这样的语句,因此Db2将为这个无效的语法抛出一个异常。

重要的是,只有才能使用为您的Db2平台和Db2版本使用匹配的Db2知识中心。不要在Db2-LUW开发中使用DB2Z/OS文档。每个平台和每个版本的语法和功能不同。

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

使用在线Db2知识的一个原因是,它包含示例程序,包括示例SQL过程,除了在github上可用外,还可以在DB2LUW服务器的sample目录中以源代码形式提供这些程序。学习这些,并让它们为你工作是明智的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66440240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档