Удалите блок исключений, если вы не хотите поймать исключение!
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;
Возможно ли иметь что-то подобное в myproc? 'PRAGMA EXCEPTION_INIT (foreign_key_violated, -02291);' Не могли бы вы быть любезными, чтобы предположить, что произойдет, если фиксация существует в процедуре? – user75ponic
Несомненно, хотя я думаю, что удаление приведет к появлению 'ORA-02292', см. Мое обновление. Для дальнейшего чтения по пользовательским исключениям: http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/errors.htm#i3329 –
Спасибо за информацию. Оценил. – user75ponic