ON EXCEPTION 语句是一个声明性语句,不是可执行语句。出于此原因,ON EXCEPTION 必须在任何可执行语句之前并且在 SPL 中必须跟随任何 DEFINE 语句。
因为 SPL 例程的主体是语句块,所以 ON EXCEPTION 语句进程在例程的开头出现,并应用于例程的整个代码中。
CREATE PROCEDURE X()
DEFINE v_cust_num CHAR(20);
FOREACH cs_insert FOR SELECT cust_num INTO v_cust_num FROM A
BEGIN
ON EXCEPTION
END EXCEPTION WITH RESUME;
INSERT INTO B(cust_num) VALUES(v_cust_num);
END
END FOREACH
END PROCEDURE
CREATE FUNCTION add_salesperson(last CHAR(15), first CHAR(15))
RETURNING INT;
DEFINE x INT;
ON EXCEPTION IN (-206) -- If no table was found, create one
CREATE TABLE emp_list
(lname CHAR(15),fname CHAR(15), tele CHAR(12));
INSERT INTO emp_list VALUES -- and insert values
(last, first, '800-555-1234');
END EXCEPTION WITH RESUME;
INSERT INTO emp_list VALUES (last, first, '800-555-1234');
SELECT count(*) INTO x FROM emp_list;
RETURN x;
END FUNCTION;
当出现错误时,数据库服务器搜索捕获错误代码的最后一个 ON EXCEPTION 语句。如果数据库服务器找不到相关 ON EXCEPTION 语句,则错误代码传回调用上下文(SPL 例程、应用程序或交互用户),执行终止。
在前面的示例中,在指定错误 -206 的 IN 子句中需要减号(-),大多数错误代码都是负整数。
CREATE PROCEDURE delete_cust (cnum INT)
ON EXCEPTION IN (-691) -- children exist
BEGIN -- Begin-end so no other DELETEs get caught in here.
ON EXCEPTION IN (-691)
DELETE FROM another_child WHERE num = cnum; { 1 }
DELETE FROM orders WHERE customer_num = cnum; { 2 }
END EXCEPTION -- for error -691
DELETE FROM orders WHERE customer_num = cnum; { 3 }
END
DELETE FROM cust_calls WHERE customer_num = cnum; { 4 }
DELETE FROM customer WHERE customer_num = cnum; { 5 }
END EXCEPTION
DELETE FROM customer WHERE customer_num = cnum; { 6 }
END PROCEDURE