-- source include/have_debug.inc SET sql_mode=ORACLE; --echo # --echo # Testing exceptions in the top-level blocks --echo # --echo # No HANDLER declarations, no exceptions DELIMITER /; CREATE FUNCTION f1 RETURN INT AS BEGIN RETURN 10; END; / DELIMITER ;/ SHOW FUNCTION CODE f1; SELECT f1(); DROP FUNCTION f1; --echo # No HANDLER declarations, no code, no exceptions DELIMITER /; CREATE PROCEDURE p1 () IS BEGIN END; / DELIMITER ;/ SHOW PROCEDURE CODE p1; CALL p1; DROP PROCEDURE p1; --echo # No HANDLER declarations, no code, some exceptions DELIMITER /; CREATE PROCEDURE p1 (v IN OUT INT) IS BEGIN EXCEPTION WHEN 1002 THEN v:=225; END; / DELIMITER ;/ SHOW PROCEDURE CODE p1; set @v= 10; CALL p1(@v); SELECT @v; DROP PROCEDURE p1; --echo # No HANDLER declarations, some code, some exceptions DELIMITER /; CREATE PROCEDURE p1 (v IN OUT INT) IS BEGIN v:=224; EXCEPTION WHEN 1002 THEN v:=225; END; / DELIMITER ;/ SHOW PROCEDURE CODE p1; set @v= 10; CALL p1(@v); SELECT @v; DROP PROCEDURE p1; --echo # Some HANDLER declarations, no code, no exceptions DELIMITER /; CREATE PROCEDURE p1 (v IN OUT INT) IS EXIT HANDLER FOR 1000 BEGIN v:=123; END; BEGIN END; / DELIMITER ;/ SHOW PROCEDURE CODE p1; set @v= 10; CALL p1(@v); SELECT @v; DROP PROCEDURE p1; --echo # Some HANDLER declarations, no code, some exceptions DELIMITER /; CREATE PROCEDURE p1 (v IN OUT INT) IS EXIT HANDLER FOR 1000 BEGIN v:=123; END; BEGIN EXCEPTION WHEN 1002 THEN v:=225; END; / DELIMITER ;/ SHOW PROCEDURE CODE p1; set @v= 10; CALL p1(@v); SELECT @v; DROP PROCEDURE p1; --echo # Some HANDLER declarations, some code, no exceptions DELIMITER /; CREATE PROCEDURE p1 (v IN OUT INT) IS EXIT HANDLER FOR 1000 BEGIN v:=123; END; BEGIN v:=223; END; / DELIMITER ;/ SHOW PROCEDURE CODE p1; set @v= 10; CALL p1(@v); SELECT @v; DROP PROCEDURE p1; --echo # Some HANDLER declarations, some code, some exceptions DELIMITER /; 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; / DELIMITER ;/ SHOW PROCEDURE CODE p1; DROP PROCEDURE p1; --echo # --echo # Testing EXCEPTIONS in internal blocks --echo # --echo # No HANDLER declarations, no code, no exceptions DELIMITER /; CREATE PROCEDURE p1 (v IN OUT INT) IS BEGIN v:=123; BEGIN END; END; / DELIMITER ;/ SHOW PROCEDURE CODE p1; SET @v=10; CALL p1(@v); SELECT @v; DROP PROCEDURE p1; --echo # No HANDLER declarations, no code, some exceptions DELIMITER /; CREATE PROCEDURE p1 (v IN OUT INT) IS BEGIN v:=123; BEGIN EXCEPTION WHEN 20002 THEN v:=335; END; END; / DELIMITER ;/ SHOW PROCEDURE CODE p1; SET @v=10; CALL p1(@v); SELECT @v; DROP PROCEDURE p1; --echo # No HANDLER declarations, some code, no exceptions DELIMITER /; CREATE PROCEDURE p1 (v IN OUT INT) IS BEGIN v:=123; BEGIN v:=223; END; END; / DELIMITER ;/ SHOW PROCEDURE CODE p1; SET @v=10; CALL p1(@v); SELECT @v; DROP PROCEDURE p1; --echo # No HANDLER declarations, some code, some exceptions DELIMITER /; CREATE PROCEDURE p1 (v IN OUT INT) IS BEGIN v:=123; BEGIN v:=223; EXCEPTION WHEN 20002 THEN v:=335; END; END; / DELIMITER ;/ SHOW PROCEDURE CODE p1; SET @v=10; CALL p1(@v); SELECT @v; DROP PROCEDURE p1; --echo # Some HANDLER declarations, no code, no exceptions DELIMITER /; CREATE PROCEDURE p1 (v IN OUT INT) IS BEGIN v:=123; DECLARE EXIT HANDLER FOR 1000 BEGIN v:=323; END; BEGIN END; END; / DELIMITER ;/ SHOW PROCEDURE CODE p1; SET @v=10; CALL p1(@v); SELECT @v; DROP PROCEDURE p1; --echo # Some HANDLER declarations, no code, some exceptions DELIMITER /; 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; / DELIMITER ;/ SHOW PROCEDURE CODE p1; SET @v=10; CALL p1(@v); SELECT @v; DROP PROCEDURE p1; --echo # Some HANDLER declarations, some code, no exceptions DELIMITER /; 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; / DELIMITER ;/ SHOW PROCEDURE CODE p1; SET @v=10; CALL p1(@v); SELECT @v; DROP PROCEDURE p1; --echo # Some HANDLER declarations, some code, some exceptions DELIMITER /; 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; / DELIMITER ;/ SHOW PROCEDURE CODE p1; SET @v=10; CALL p1(@v); SELECT @v; DROP PROCEDURE p1; --echo # --echo # Testing EXIT statement --echo # DELIMITER /; 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; / DELIMITER ;/ SHOW FUNCTION CODE f1; SELECT f1() FROM DUAL; DROP FUNCTION f1; DELIMITER /; 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; / DELIMITER ;/ SHOW FUNCTION CODE f1; SELECT f1() FROM DUAL; DROP FUNCTION f1; DELIMITER /; 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; / DELIMITER ;/ SHOW PROCEDURE CODE p1; set @v= 10; CALL p1(@v); SELECT @v; DROP PROCEDURE p1;