如何在PL/SQL中自定义并抛出SQLException?
PL/SQL自定义并抛出异常的方法
在PL/SQL里,你可以通过两种常见方式自定义并抛出自己的异常,满足业务场景的错误处理需求:
方式一:声明自定义异常变量
这种方式适合需要单独定义特定业务异常的场景,步骤清晰直接:
- 在
DECLARE块中声明自定义异常 - 在业务逻辑中用
RAISE语句触发异常 - 在
EXCEPTION块中捕获并处理该异常
代码示例
DECLARE c_id customers.id%type := 1; c_name customers.name%type; c_age customers.age%type; -- 声明自定义异常 invalid_customer_age EXCEPTION; BEGIN SELECT name, age INTO c_name, c_age FROM customers WHERE id = c_id; -- 业务判断:如果客户年龄小于18,抛出自定义异常 IF c_age < 18 THEN RAISE invalid_customer_age; END IF; DBMS_OUTPUT.PUT_LINE('Name: ' || c_name || ', Age: ' || c_age); EXCEPTION WHEN no_data_found THEN dbms_output.put_line('No such customer!'); WHEN invalid_customer_age THEN dbms_output.put_line('Error: Customer age cannot be less than 18!'); WHEN others THEN dbms_output.put_line('Unknown error occurred!'); END;
方式二:使用RAISE_APPLICATION_ERROR直接抛出带错误码的异常
如果需要抛出类似系统级SQLException的自定义异常(带错误代码和详细消息),用RAISE_APPLICATION_ERROR函数更合适。它允许你使用Oracle预留的用户自定义错误码范围(-20000到-20999),无需提前声明异常变量。
代码示例
DECLARE c_id customers.id%type := 2; c_name customers.name%type; c_addr customers.address%type; BEGIN SELECT name, address INTO c_name, c_addr FROM customers WHERE id = c_id; -- 业务判断:如果地址为空,抛出带错误码的自定义异常 IF c_addr IS NULL OR c_addr = '' THEN RAISE_APPLICATION_ERROR(-20001, 'Customer address cannot be empty!'); END IF; DBMS_OUTPUT.PUT_LINE('Name: ' || c_name || ', Address: ' || c_addr); EXCEPTION WHEN no_data_found THEN dbms_output.put_line('No such customer!'); WHEN OTHERS THEN -- 捕获并打印错误码和消息 dbms_output.put_line('Error Code: ' || SQLCODE || ', Error Message: ' || SQLERRM); END;
执行结果示例
触发自定义异常时会输出:
Error Code: -20001, Error Message: ORA-20001: Customer address cannot be empty! PL/SQL procedure successfully completed.
内容的提问来源于stack exchange,提问作者Aniketh B R
相关产品推荐
相关产品推荐

