私は次のプロシージャを実行し、カーソルが渡されるパラメータを見つけることができない場合、ブロック(insert文)を実行し続けますが、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');
親の外部キーエラーが正しいですが、私は、カーソルが行を返さdoesntの場合、ブロックはexeceuteしたくありません。なぜこうなった?
また、COMMITを置くという点では、正確にどこにCOMMITするのですか?例外の前か後?
これは単式割り当てのためのものです。
私が設定した他のトリガーに影響するため、挿入が成功した場合にのみコミットします。 – Deep
CTITLEパラメータがテーブルに見つからない場合、カーソルを使用しているときにNODATAFOUND例外トリガを持つ方法はありませんか? – Deep
@Deep - まあ、投稿されたコードでは、コミットは例外ハンドラでのみ実行されますが、決して実行されません。あなたはコミットしていません。 INSERTの直後にコミットを置くと、INSERTが例外を生成しない場合にのみ実行されます。また、参照しているトリガーがBEFORE/AFTER INSERTトリガーの場合、INSERTステートメントの実行中に呼び出されます。コミットされていないトリガーは呼び出されません。 –