Oracle SQL存储过程结构、异常处理示例
-- 存储过程结结构。 -- EXCeption不是存储过程必须部分,可以用作本存储过程的异常处理,但如果没有异常处理,出了异常将会终止程序 CREATE PROCEDURE procedure_name () IS/AS BEGIN -- .... EXCEPTION -- ... END; -- PL/SQL代码块是什么? -- 下面就是。 -- EXCeption不是PL/SQL必须部分,可以用作本PL/SQL代码块的异常处理,但如果没有异常处理,出了异常将会终止程序 BEGIN -- .... EXCEPTION -- ... END; -- ====================================== ---- 昨天说,一个存储过程里可以有多个PL/SQL代码块 -- ====================================== --也就是说可以这样 CREATE PROCEDURE procedure_name () IS/AS BEGIN -- .PL/SQL代码块 1: BEGIN -- .... -- 此处出了异常, -- 因为作了处理,本代码块将不执行,但程序可以继续 -- 也就是说 PL/SQL代码块2 ,PL/SQL代码块3还可以执行 EXCEPTION --异常处理 -- ... END; -- .PL/SQL代码块 2: BEGIN -- ....如果此处出了异常, -- 因为本PL/SQL 未做异常处理,那么就只有两种结果 -- 1、存储过程有异常处理,可以处理这个异常,于存储过程的异常处理来说,只要进了这个异常,本PL/SQl代码做完异常处理后,程序也将无法继续 -- 2、存储过程有异常处理但无法处理该异常,或者存储过程没有异常处理,程序出错,将无法继续执行 -- 上面两种情况都会导致 ,程序无法继续,简单说, PL/SQL代码块3不会执行 END; -- .PL/SQL代码块 3: BEGIN --... EXCEPTION --.. END; -- ... 存储过程的异常处理 EXCEPTION -- ...。。 END;
eg:
DECLARE v_my_err EXCEPTION; v_i INTEGER ; BEGIN FOR v_i IN 1..10 LOOP BEGIN IF v_i=3 THEN RAISE v_my_err; ELSE dbms_output.put_line(v_i); END IF; EXCEPTION WHEN v_my_err THEN dbms_output.put_line('我有异常处理,下面的继续'); END; BEGIN IF v_i=6THEN dbms_output.put_line('我没有异常处理,出了异常下面的不执行'); RAISE v_my_err; ELSE dbms_output.put_line(v_i); END IF; END; END LOOP; EXCEPTION WHEN OTHERS THEN dbms_output.put_line('出了异常,结束'); END;