2012-05-24 5 views
0

У меня есть процедура plsql для удаления записей из дочерних и родительских таблиц.Raise Exception при обнаружении дочерней записи

Я хотел бы привлечь исключение, если детская запись найдена.

Как я могу это сделать?

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; 
/

ответ

3

Удалите блок исключений, если вы не хотите поймать исключение!

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; 

Вы не должны поймать их всех (exceptions are not pokemon). Если вы действительно настаиваете на ловле и ре-рейз вы можете использовать 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; 

Если вы хотите быть более конкретным и ловушки только исключение ребенка, вам придется define the exception номер, поскольку нет predefined exception в 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; 
+0

Возможно ли иметь что-то подобное в myproc? 'PRAGMA EXCEPTION_INIT (foreign_key_violated, -02291);' Не могли бы вы быть любезными, чтобы предположить, что произойдет, если фиксация существует в процедуре? – user75ponic

+1

Несомненно, хотя я думаю, что удаление приведет к появлению 'ORA-02292', см. Мое обновление. Для дальнейшего чтения по пользовательским исключениям: http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/errors.htm#i3329 –

+0

Спасибо за информацию. Оценил. – user75ponic

1

I would like to raise exception when child record found

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; 

НТН.

Алессандро

PS: изменил мой ответ для чтения дефицит понимания, я думал, что вы хотели, и исключение, когда ребенок запись не найдена.

+0

Спасибо за ответ, решение Vincent Malgrat решило мою проблему. Оценил. – user75ponic

Смежные вопросы