【问题标题】:Can WHENEVER NOT FOUND Handler be used in a FOR loop可以在 FOR 循环中使用 WHENEVER NOT FOUND 处理程序吗
【发布时间】:2018-05-29 20:33:55
【问题描述】:

当 FOR 循环中没有行时,是否可以使用 WHENEVER NOT FOUND 处理程序?

我正在编写一个模板存储过程生成器,作为 2E 模型转换的一部分。我有数以千计的 2E 函数,我需要一个存储过程格式,我正在尝试为每种类型的 2E 函数找到最佳和最有效的通用案例模板。

这是我的模板过程

CREATE PROCEDURE SP_M3_000TSG (
    IN HONB DECIMAL(9, 0) 
    , OUT ABCD CHAR(3) DEFAULT ' ' 
    , OUT EECD CHAR(6) DEFAULT ' ' 
    , OUT RTN CHAR(7) DEFAULT NULL 
    )

    LANGUAGE SQL
    PROGRAM TYPE SUB

    -- #######################################################################
    -- # SP_M3_000TSG
    -- #######################################################################
BEGIN
    DECLARE SQLCODE INTEGER DEFAULT 0;
    DECLARE SQLSTATE CHAR(5) DEFAULT '00000';

    M3_INIT:BEGIN
      -- do some init stuff
    END M3_INIT;

    FOR M3_000TSG 
        **declare WHENEVER NOT FOUND **
        AS CUR_ECDQREL1 CURSOR
        FOR
            SELECT * FROM ECDQREL1 WHERE DQHONB = HONB
            DO 
                do some stuff;
    END FOR;

    GO TO M3_EXIT;

    M3_NO_ROWS: BEGIN
        do some stuff for no rows;
    END M3_NO_ROWS;

    M3_EXIT: BEGIN
        do some stuff;
        RETURN;
    END M3_EXIT;
END

【问题讨论】:

  • 我怀疑这里没有多少人会知道 2E 是什么......你应该问CA 2E/Plex Community
  • 真的,不需要知道2E。只是尝试制作不会让我尴尬的良好存储过程。
  • 用例是什么 如果没有找到行,则接受参数执行 FOR 循环 清理我试图不声明变量只是为了测试是否有任何行
  • 抱歉,被FOR 循环弄糊涂了……我从未使用过游标变体。

标签: stored-procedures db2 db2-400


【解决方案1】:

对于当前版本的 Db2,您不能在 SQL-PL 过程中使用 WHENEVER NOT FOUND 语法。

相反,您只能在预编译器对其起作用的嵌入式 SQL 程序中使用此语法。

在 SQL-PL 过程中,您可以为 NOT FOUND 声明处理程序,也可以对 SQLCODE 100 或 SQLSTATE '02000' 进行代码检查。

【讨论】:

  • 我要做的是在 for 循环之前声明一个标志并在 for 循环内设置标志。我希望不必声明自己的标志
猜你喜欢
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 2012-10-12
  • 2021-04-21
  • 2016-03-24
  • 1970-01-01
  • 2018-05-07
相关资源
最近更新 更多