如何在PL/SQL中处理‘too many values’异常?
处理PL/SQL中"too many values"(ORA-00913)异常的解决方法
问题原因
ORA-00913(即提示的"too many values")不属于PL/SQL预定义的命名异常(比如NO_DATA_FOUND、TOO_MANY_ROWS这类有专属名称的异常),所以直接用WHEN 异常名 THEN的方式无法捕获,必须通过绑定错误码或通用异常分支判断来处理。
两种解决方法
方法1:用PRAGMA EXCEPTION_INIT绑定错误码到自定义异常
先声明自定义异常,通过PRAGMA EXCEPTION_INIT将ORA-00913的错误码(-913)绑定到该异常,之后就能像捕获预定义异常一样处理。
示例代码:
SET SERVEROUTPUT ON; -- 开启输出,确保能看到自定义提示 DECLARE v_empno emptest.empno%TYPE; v_ename emptest.ename%TYPE; -- 声明自定义异常 too_many_values_err EXCEPTION; -- 绑定ORA-00913错误码到自定义异常 PRAGMA EXCEPTION_INIT(too_many_values_err, -913); BEGIN -- 错误触发场景:SELECT返回列数与左侧变量数不匹配 SELECT empno, ename, sal INTO v_empno, v_ename FROM emptest WHERE empno = 7369; EXCEPTION WHEN too_many_values_err THEN DBMS_OUTPUT.PUT_LINE('自定义提示:字段数量不匹配,触发了too many values错误'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('其他错误:' || SQLERRM); END; /
方法2:在WHEN OTHERS分支中判断错误码
如果不想声明自定义异常,也可以在通用异常分支里通过SQLCODE判断是否为ORA-00913错误,再输出自定义提示。
示例代码:
SET SERVEROUTPUT ON; DECLARE v_empno emptest.empno%TYPE; v_ename emptest.ename%TYPE; BEGIN SELECT empno, ename, sal INTO v_empno, v_ename FROM emptest WHERE empno = 7369; EXCEPTION WHEN OTHERS THEN IF SQLCODE = -913 THEN DBMS_OUTPUT.PUT_LINE('自定义提示:字段数量不匹配,触发了too many values错误'); ELSE DBMS_OUTPUT.PUT_LINE('其他错误:' || SQLERRM); END IF; END; /
注意事项
- 确保执行前开启
DBMS_OUTPUT输出(如SQL*Plus中执行SET SERVEROUTPUT ON;),否则无法看到自定义提示信息。 - "too many values"通常由以下场景触发:
SELECT INTO时查询列数与接收变量数不匹配、INSERT时VALUES子句的值数量与目标表列数不匹配等,排查时可先确认SQL语句的字段/值数量是否对应。
内容的提问来源于stack exchange,提问作者Dyumani Sharma
相关产品推荐
相关产品推荐

