【问题标题】:How can I use COMMIT in stored procedure in DB2 LUW如何在 DB2 LUW 的存储过程中使用 COMMIT
【发布时间】:2019-05-09 06:00:27
【问题描述】:
CREATE TABLE T1(c1 varchar(10));

CREATE OR REPLACE PROCEDURE FOO()
BEGIN
FOR C AS WITH TT (C1) AS (VALUES (1) , (2) , (3)) SELECT C1 FROM TT
DO
INSERT INTO T1 VALUES ('aaa');
COMMIT;
END FOR;
END
@

当我执行这个存储过程时,我得到这个错误:

db2“调用 foo()”
SQL0501N 在 FETCH 语句或 CLOSE 语句中指定的游标不是 打开或游标标量函数引用中的游标变量未打开。

如何为每个插入提交?

【问题讨论】:

  • 旁注:你需要小心在一个过程中使用COMMIT/ROLLBACK,因为它会使组合变得困难——如果另一个过程调用这个,你最终可能会提交/滚动返回您不知道的更改。如果您在此处必须 COMMIT,最好使用autonomous transaction。否则,让调用者处理范围。此外,可以在不使用循环的情况下编写该语句,但尚不清楚您的真实语句是否可以。

标签: sql stored-procedures db2 db2-luw


【解决方案1】:

COMMIT 关闭所有未使用HOLD 选项声明的打开游标,包括由FOR 语句隐式创建的游标。

这是您需要进行的更改:

FOR C AS cur1 CURSOR WITH HOLD FOR
WITH TT (C1) AS (VALUES (1) , (2) , (3)) SELECT C1 FROM TT
DO
  INSERT INTO T1 VALUES ('aaa');
  COMMIT;
END FOR;

Documentation reference.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2018-05-16
    相关资源
    最近更新 更多