SET sql_mode=ORACLE; # # Testing exceptions in the top-level blocks # # No HANDLER declarations, no exceptions CREATE FUNCTION f1 RETURN INT AS BEGIN RETURN 10; END; / SHOW FUNCTION CODE f1; Pos Instruction 0 freturn 3 10 SELECT f1(); f1() 10 DROP FUNCTION f1; # No HANDLER declarations, no code, no exceptions CREATE PROCEDURE p1 () IS BEGIN END; / SHOW PROCEDURE CODE p1; Pos Instruction 0 jump 2 CALL p1; DROP PROCEDURE p1; # No HANDLER declarations, no code, some exceptions CREATE PROCEDURE p1 (v IN OUT INT) IS BEGIN EXCEPTION WHEN 1002 THEN v:=225; END; / SHOW PROCEDURE CODE p1; Pos Instruction 0 jump 1 1 hpush_jump 4 1 EXIT 2 set v@0 225 3 hreturn 0 4 4 hpop 1 set @v= 10; CALL p1(@v); SELECT @v; @v 10 DROP PROCEDURE p1; # No HANDLER declarations, some code, some exceptions CREATE PROCEDURE p1 (v IN OUT INT) IS BEGIN v:=224; EXCEPTION WHEN 1002 THEN v:=225; END; / SHOW PROCEDURE CODE p1; Pos Instruction 0 jump 3 1 set v@0 224 2 jump 6 3 hpush_jump 1 1 EXIT 4 set v@0 225 5 hreturn 0 6 6 hpop 1 set @v= 10; CALL p1(@v); SELECT @v; @v 224 DROP PROCEDURE p1; # Some HANDLER declarations, no code, no exceptions CREATE PROCEDURE p1 (v IN OUT INT) IS EXIT HANDLER FOR 1000 BEGIN v:=123; END; BEGIN END; / SHOW PROCEDURE CODE p1; Pos Instruction 0 hpush_jump 3 1 EXIT 1 set v@0 123 2 hreturn 0 3 3 hpop 1 set @v= 10; CALL p1(@v); SELECT @v; @v 10 DROP PROCEDURE p1; # Some HANDLER declarations, no code, some exceptions CREATE PROCEDURE p1 (v IN OUT INT) IS EXIT HANDLER FOR 1000 BEGIN v:=123; END; BEGIN EXCEPTION WHEN 1002 THEN v:=225; END; / SHOW PROCEDURE CODE p1; Pos Instruction 0 hpush_jump 3 1 EXIT 1 set v@0 123 2 hreturn 0 6 3 hpush_jump 6 1 EXIT 4 set v@0 225 5 hreturn 0 6 6 hpop 2 set @v= 10; CALL p1(@v); SELECT @v; @v 10 DROP PROCEDURE p1; # Some HANDLER declarations, some code, no exceptions CREATE PROCEDURE p1 (v IN OUT INT) IS EXIT HANDLER FOR 1000 BEGIN v:=123; END; BEGIN v:=223; END; / SHOW PROCEDURE CODE p1; Pos Instruction 0 hpush_jump 3 1 EXIT 1 set v@0 123 2 hreturn 0 4 3 set v@0 223 4 hpop 1 set @v= 10; CALL p1(@v); SELECT @v; @v 223 DROP PROCEDURE p1; # Some HANDLER declarations, some code, some exceptions CREATE PROCEDURE p1 (v IN OUT VARCHAR2(20)) IS EXIT HANDLER FOR 1000 BEGIN v:=123; END; CONTINUE HANDLER FOR 1001 BEGIN SET v=223; END; BEGIN v:= 1; EXCEPTION WHEN 1002 THEN SET v=225; END; / SHOW PROCEDURE CODE p1; Pos Instruction 0 hpush_jump 3 1 EXIT 1 set v@0 123 2 hreturn 0 12 3 hpush_jump 8 1 CONTINUE 4 set v@0 223 5 hreturn 1 6 set v@0 1 7 jump 12 8 hpush_jump 6 1 EXIT 9 set v@0 225 10 hreturn 0 12 11 jump 6 12 hpop 3 DROP PROCEDURE p1; # # Testing EXCEPTIONS in internal blocks # # No HANDLER declarations, no code, no exceptions CREATE PROCEDURE p1 (v IN OUT INT) IS BEGIN v:=123; BEGIN END; END; / SHOW PROCEDURE CODE p1; Pos Instruction 0 set v@0 123 1 jump 5 SET @v=10; CALL p1(@v); SELECT @v; @v 123 DROP PROCEDURE p1; # No HANDLER declarations, no code, some exceptions CREATE PROCEDURE p1 (v IN OUT INT) IS BEGIN v:=123; BEGIN EXCEPTION WHEN 20002 THEN v:=335; END; END; / SHOW PROCEDURE CODE p1; Pos Instruction 0 set v@0 123 1 jump 2 2 hpush_jump 5 1 EXIT 3 set v@0 335 4 hreturn 0 5 5 hpop 1 SET @v=10; CALL p1(@v); SELECT @v; @v 123 DROP PROCEDURE p1; # No HANDLER declarations, some code, no exceptions CREATE PROCEDURE p1 (v IN OUT INT) IS BEGIN v:=123; BEGIN v:=223; END; END; / SHOW PROCEDURE CODE p1; Pos Instruction 0 set v@0 123 1 set v@0 223 2 jump 6 SET @v=10; CALL p1(@v); SELECT @v; @v 223 DROP PROCEDURE p1; # No HANDLER declarations, some code, some exceptions CREATE PROCEDURE p1 (v IN OUT INT) IS BEGIN v:=123; BEGIN v:=223; EXCEPTION WHEN 20002 THEN v:=335; END; END; / SHOW PROCEDURE CODE p1; Pos Instruction 0 set v@0 123 1 jump 4 2 set v@0 223 3 jump 7 4 hpush_jump 2 1 EXIT 5 set v@0 335 6 hreturn 0 7 7 hpop 1 SET @v=10; CALL p1(@v); SELECT @v; @v 223 DROP PROCEDURE p1; # Some HANDLER declarations, no code, no exceptions CREATE PROCEDURE p1 (v IN OUT INT) IS BEGIN v:=123; DECLARE EXIT HANDLER FOR 1000 BEGIN v:=323; END; BEGIN END; END; / SHOW PROCEDURE CODE p1; Pos Instruction 0 set v@0 123 1 hpush_jump 4 1 EXIT 2 set v@0 323 3 hreturn 0 4 4 hpop 1 SET @v=10; CALL p1(@v); SELECT @v; @v 123 DROP PROCEDURE p1; # Some HANDLER declarations, no code, some exceptions CREATE PROCEDURE p1 (v IN OUT INT) IS BEGIN v:=123; DECLARE EXIT HANDLER FOR 1000 BEGIN v:=323; END; BEGIN EXCEPTION WHEN 20002 THEN v:=335; END; END; / SHOW PROCEDURE CODE p1; Pos Instruction 0 set v@0 123 1 hpush_jump 4 1 EXIT 2 set v@0 323 3 hreturn 0 7 4 hpush_jump 7 1 EXIT 5 set v@0 335 6 hreturn 0 7 7 hpop 2 SET @v=10; CALL p1(@v); SELECT @v; @v 123 DROP PROCEDURE p1; # Some HANDLER declarations, some code, no exceptions CREATE PROCEDURE p1 (v IN OUT INT) IS BEGIN v:=123; DECLARE EXIT HANDLER FOR 1000 BEGIN v:=323; END; BEGIN v:= 324; END; END; / SHOW PROCEDURE CODE p1; Pos Instruction 0 set v@0 123 1 hpush_jump 4 1 EXIT 2 set v@0 323 3 hreturn 0 5 4 set v@0 324 5 hpop 1 SET @v=10; CALL p1(@v); SELECT @v; @v 324 DROP PROCEDURE p1; # Some HANDLER declarations, some code, some exceptions CREATE PROCEDURE p1 (v IN OUT INT) IS BEGIN v:=123; DECLARE EXIT HANDLER FOR 1000 BEGIN v:=323; END; BEGIN v:= 324; EXCEPTION WHEN 2002 THEN v:= 325; END; END; / SHOW PROCEDURE CODE p1; Pos Instruction 0 set v@0 123 1 hpush_jump 6 1 EXIT 2 set v@0 323 3 hreturn 0 9 4 set v@0 324 5 jump 9 6 hpush_jump 4 1 EXIT 7 set v@0 325 8 hreturn 0 9 9 hpop 2 SET @v=10; CALL p1(@v); SELECT @v; @v 324 DROP PROCEDURE p1; # # Testing EXIT statement # CREATE FUNCTION f1 RETURN INT IS i INT := 0; BEGIN LOOP i:= i + 1; IF i >= 5 THEN EXIT; END IF; END LOOP; RETURN i; END; / SHOW FUNCTION CODE f1; Pos Instruction 0 set i@0 0 1 set i@0 (i@0 + 1) 2 jump_if_not 1(1) (i@0 >= 5) 3 jump 4 4 freturn 3 i@0 SELECT f1() FROM DUAL; f1() 5 DROP FUNCTION f1; CREATE FUNCTION f1 RETURN INT IS i INT := 0; BEGIN LOOP i:= i + 1; EXIT WHEN i >=5; END LOOP; RETURN i; END; / SHOW FUNCTION CODE f1; Pos Instruction 0 set i@0 0 1 set i@0 (i@0 + 1) 2 jump_if_not 1(0) (i@0 >= 5) 3 jump 4 4 freturn 3 i@0 SELECT f1() FROM DUAL; f1() 5 DROP FUNCTION f1; CREATE FUNCTION f1 RETURN INT IS i INT := 0; BEGIN LOOP BEGIN i:= i + 1; IF i >= 5 THEN EXIT; END IF; EXCEPTION WHEN OTHERS THEN i:= 1000; END; END LOOP; RETURN i; END; / SHOW FUNCTION CODE f1; Pos Instruction 0 set i@0 0 1 jump 5 2 set i@0 (i@0 + 1) 3 jump_if_not 8(8) (i@0 >= 5) 4 jump 10 5 hpush_jump 2 1 EXIT 6 set i@0 1000 7 hreturn 0 8 8 hpop 1 9 jump 5 10 freturn 3 i@0 SELECT f1() FROM DUAL; f1() 5 DROP FUNCTION f1; CREATE PROCEDURE p1(a IN OUT INT) IS i INT := 0; BEGIN LOOP LOOP BEGIN i:= i + 1; IF i >=5 THEN EXIT; END IF; EXCEPTION WHEN OTHERS THEN a:=1000; END; END LOOP; i:= i + 100; EXIT; END LOOP; a:= i; EXCEPTION WHEN OTHERS THEN a:=11; END; / SHOW PROCEDURE CODE p1; Pos Instruction 0 set i@1 0 1 jump 14 2 set i@1 (i@1 + 1) 3 jump_if_not 8(8) (i@1 >= 5) 4 jump 10 5 hpush_jump 2 2 EXIT 6 set a@0 1000 7 hreturn 0 8 8 hpop 1 9 jump 5 10 set i@1 (i@1 + 100) 11 jump 12 12 set a@0 i@1 13 jump 17 14 hpush_jump 5 2 EXIT 15 set a@0 11 16 hreturn 0 17 17 hpop 1 set @v= 10; CALL p1(@v); SELECT @v; @v 105 DROP PROCEDURE p1;