所以我遇到的问题是,如果我执行以下过程并且游标没有找到传递的参数,它继续执行块(插入语句)但不抛出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?在例外或之后?
这是一个单一的任务.
循环遍历这样的游标时,如果游标找不到匹配的行,则循环根本不执行.只有SELECT ... INTO ...在BEGIN/END块内部没有返回任何行的语句时,才会引发NO_DATA_FOUND异常.
现在放置COMMIT的地方,它是EXCEPTION块的一部分 - 但是你的缩进意味着你想要它执行是否发生了异常.在这种情况下,我会在INSERT之后立即放置COMMIT,因为只有INSERT成功才有意义.