You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:55:32