1

子テーブルと親テーブルからレコードを削除する plsql プロシージャがあります。

子レコードが見つかったときに例外を発生させたい。

これどうやってするの?

CREATE OR REPLACE PROCEDURE myproc(
    p_id       number,
    p_id2      number,
    p_par3      number)
AS
BEGIN
 DELETE FROM   child_table
            WHERE   id1 = p_id and par=p_par3;

    DELETE FROM   parent_table
            WHERE   no = p_id2;
COMMIT;

EXCEPTION   
    WHEN OTHERS
    THEN
        --raise
END myproc;
/
4

2 に答える 2

6

例外をキャッチしたくない場合は、例外ブロックを削除してください。

CREATE OR REPLACE PROCEDURE myproc(p_id NUMBER, p_id2 NUMBER, p_par3 NUMBER) AS
BEGIN
   DELETE FROM child_table
    WHERE id1 = p_id
      AND par = p_par3;

   DELETE FROM parent_table WHERE no = p_id2;
   COMMIT; /* do you really want to commit in a procedure? */
END myproc;

すべてを捕まえる必要はありません (例外はポケモンではありません)。キャッチして再レイズすることを本当に主張する場合は、RAISEまたはRAISE_APPLICATION_ERRORを使用できます。

EXCEPTION
   WHEN OTHERS THEN
      raise_application_error(-20001 /* user-defined exception number 
                                        between -20999 and -20000 */,
                              'your user-defined exception message',
                              TRUE /* this will preserve the error stack */
                              );
END;

子例外のみをより具体的にトラップする場合は、例外番号を定義する必要があります。これは、PL/SQL にこのエラーに対する事前定義された例外がないためです。

CREATE OR REPLACE PROCEDURE myproc(p_id NUMBER, p_id2 NUMBER, p_par3 NUMBER) AS
   child_exists EXCEPTION;
   PRAGMA EXCEPTION_INIT(child_exists, -2292); /* raises ORA-02292 */
BEGIN
   DELETE FROM child_table
    WHERE id1 = p_id
      AND par = p_par3;

   DELETE FROM parent_table WHERE no = p_id2;
   COMMIT; /* do you really want to commit in a procedure? */

EXCEPTION
   WHEN child_exists THEN
      -- do something
      RAISE;
END myproc;
于 2012-05-24T07:48:38.377 に答える
1

子レコードが見つかったときに例外を発生させたい

create or replace procedure myproc(p_id number, p_id2 number, p_par3 number)
as
begin

   delete from child_table
    where id1 = p_id
      and par = p_par3;

   if sql%rowcount > 0 then
      raise_application_error(-20001, 'Child record(s) found!');
   end if;

   delete from parent_table where no = p_id2;

end myproc;

HTH。

アレッサンドロ

PS: 読解力の欠如に対する私の回答を修正しました。

于 2012-05-24T08:02:48.573 に答える