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;

您不必全部捕获它们(例外不是口袋妖怪)。如果你真的坚持追赶和重新加注,你可以使用RAISERAISE_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 回答