带有SQL%NOTFOUND的PL / SQL raise_application_error

时间:2015-01-28 18:25:59

标签: plsql

我正在尝试编写一个程序,检查我的某些表中的人是否被正确分配。这是包中的第一个过程。如果每个人都被正确分配,SQL将不返回任何记录。如果未分配人员,则SQL将返回未分配的人员。

...

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中运行此消息的最终用户发出两条不同的消息。如果没有返回结果,则为每个人分配,我想输出第一个IF语句"所有人分配,继续"。如果SQL返回记录,那么理想情况下我希望第二个IF执行" MISSING People"。

目前,当人们失踪时,我会得到“失去的人”#34;输出给用户。但如果每个人都已经被分配,我只需要完成"程序完成"。

1 个答案:

答案 0 :(得分:1)

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;