我读到(并尝试)不能在存储过程中与UR一起使用DB2。有人告诉我,我可以使用SET选项来实现同样的目标。但是,当我在存储过程中实现它时,它无法编译(我在它的位置上移动了相同的错误)。我的问题是:
下面是我的代码的简化版本:
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中使用时的代码/错误
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
发布于 2021-03-02 16:24:09
对于静态SQL:
您需要使用UR绑定例程包,因为您的DECLARE GTT语句是静态的。在CREATE OR REPLACE在同一会话中使用以下内容之前:
CALL SET_ROUTINE_OPTS('ISOLATION UR')P.S.:如果您想在同一会话中运行例程不止一次而没有错误,请使用附加的WITH REPLACE选项DECLARE。
发布于 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目录中以源代码形式提供这些程序。学习这些,并让它们为你工作是明智的。
https://stackoverflow.com/questions/66440240
复制相似问题