所以我遇到的问题是,如果我执行下面的过程,并且游标不找到传递的参数,它将继续执行块(插入语句),而不是抛出NO_DATA_FOUND异常错误,它会抛出父/外部关键错误。为什么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');
而父外键的错误是正确的,我不希望块execeute如果光标犯规返回一行。这是为什么发生?
另外,就放置COMMIT而言,我到底在哪里告诉COMMIT?在例外之前或之后?
这是一个uni任务。
我想提交只有插入成功,因为它会影响我设置的其他触发器。 – Deep
那么如果在表中找不到CTITLE参数,那么在使用游标时没有办法使用NODATAFOUND异常触发器? – Deep
@Deep - 那么,在您的代码发布,提交只发生在异常处理程序,它将永远不会执行。所以你没有提交。如果您在INSERT之后立即执行提交,则只有在INSERT不引发异常时才会执行该提交。另外,如果您所引用的触发器是BEFORE/AFTER INSERT触发器,则它们将在执行INSERT语句期间调用,而不是在提交时调用。 –