PL/SQL raise_application_error SQL%NOTFOUND

PL/SQL raise_application_error with SQL%NOTFOUND

我正在尝试编写一个程序来检查我的某些表中的人员是否已正确分配。这是包中的第一个过程。如果每个人都分配正确,SQL 将 return 没有记录。如果未分配人员,SQL 将 return 那些未分配的人员。

...

BEGIN

    FOR R_PEOPLE IN C_PEOPLE

        LOOP

        IF SQL%NOTFOUND THEN
            RAISE_APPLICATION_ERROR(-20002, 'ALL PEOPLE ASSIGNED, PROCEED');
        END IF;

       -- When data is found, should raise exception and stop billing process

        IF SQL%FOUND THEN
            RAISE_APPLICATION_ERROR(-20001, 'MISSING PEOPLE');
        END IF;

        END LOOP;

END;

我想做的是向最终用户发出两条不同的消息,最终用户将在 TOAD 中成为 运行。如果没有结果returned,大家都赋值了,我要输出第一个IF语句"ALL PEOPLE ASSIGNED, PROCEED"。如果 SQL returns 记录那么理想情况下我希望第二个 IF 执行 "MISSING People".

目前,当有人失踪时,我会向用户输出 "MISSING PEOPLE"。但是如果每个人都已经分配好了,我就得到 "Procedure Complete"。

FOR R_PEOPLE IN C_PEOPLE

    LOOP

    IF SQL%NOTFOUND THEN
    -- ^^^^^^^^^^^^
    -- this can never be true since if there was no row,
    -- you won't enter the loop
        RAISE_APPLICATION_ERROR(-20002, 'ALL PEOPLE ASSIGNED, PROCEED');
    END IF;

    ...

这是行不通的,因为如果没有匹配项,您甚至不会执行一次循环体。


我不知道你的查询如何,但也许你可以使用 COUNT(*) 重写它并使用结果(0 或非零)来引发适当的异常?

某些喜欢,也许:

SELECT COUNT(*) INTO RESULT FROM .... WHERE ..... ;
IF RESULT = 0
THEN
    RAISE_APPLICATION_ERROR(-20002, 'ALL PEOPLE ASSIGNED, PROCEED');
ELSE
    RAISE_APPLICATION_ERROR(-20001, 'MISSING PEOPLE');
END IF;