为什么没有触发异常NO_DATA_FOUND?

Dee*_*eep 2 sql oracle plsql

所以我遇到的问题是,如果我执行以下过程并且游标没有找到传递的参数,它继续执行块(插入语句)但不抛出NO_DATA_FOUND异常错误它会抛出父/外键错误.

CREATE OR REPLACE PACKAGE ASSIGNMENT3 IS

PROCEDURE END_CAMPAIGN(CTITLE IN CAMPAIGN.CAMPAIGNTITLE%TYPE);

END ASSIGNMENT3;
/    

CREATE OR REPLACE PACKAGE BODY ASSIGNMENT3 AS    
    PROCEDURE END_CAMPAIGN(CTITLE IN CAMPAIGN.CAMPAIGNTITLE%TYPE) IS
        CURSOR ADCOST_CUR IS
        SELECT ACTUALCOST
        FROM ADVERTISEMENT
        WHERE ADVERTISEMENT.CAMPAIGNTITLE = CTITLE;
        V_TOTALCOST NUMBER;

        BEGIN
        V_TOTALCOST := 0;
          FOR INVOICE_REC IN ADCOST_CUR
          LOOP
            V_TOTALCOST := V_TOTALCOST + INVOICE_REC.ACTUALCOST;
          END LOOP;
          INSERT INTO INVOICE(INVOICENO, CAMPAIGNTITLE, DATEISSUED, DATEPAID, BALANCEOWING, STATUS)
          VALUES (AUTOINCREMENTINVOICE.nextval, CTITLE, SYSDATE, NULL,V_TOTALCOST,NULL);
            EXCEPTION WHEN NO_DATA_FOUND THEN
              DBMS_OUTPUT.PUT_LINE('ERROR:The campaign title you entered returned no record(s), please enter a valid campaign title.');
        COMMIT;
        END END_CAMPAIGN;


        END ASSIGNMENT3;
        /


        SET SERVEROUTPUT ON
        EXECUTE ASSIGNMENT3.END_CAMPAIGN('Panasonic 3D TV');
Run Code Online (Sandbox Code Playgroud)

虽然父外键错误是正确的,但如果光标没有返回行,我不希望该块执行.为什么会这样?

另外,在放置COMMIT方面,我告诉它究竟在哪里进行COMMIT?在例外或之后?

这是一个单一的任务.

Dav*_*sta 5

循环遍历这样的游标时,如果游标找不到匹配的行,则循环根本不执行.只有SELECT ... INTO ...在BEGIN/END块内部没有返回任何行的语句时,才会引发NO_DATA_FOUND异常.

现在放置COMMIT的地方,它是EXCEPTION块的一部分 - 但是你的缩进意味着你想要它执行是否发生了异常.在这种情况下,我会在INSERT之后立即放置COMMIT,因为只有INSERT成功才有意义.