Oracle中向PL/SQL传递数组用于IN子句时遇ORA-01403错误
问题分析与解决方案
核心问题
你的PL/SQL代码执行报错ORA-01403: no data found,但直接查询能返回结果,主要原因有两个:
- 表名未指定Schema:PL/SQL中查询的
ac表未明确所有者,Oracle默认查询当前登录用户名下的ac表(该表无数据),而实际数据存储在ORADBA.AC中。 - 冗余无效代码:
I_ACCOUNT_NUM变量未声明类型且未参与后续逻辑,属于无效代码,可能引发潜在编译问题。 - (可选)自定义类型引用缺失Schema:若
NBR_ARRAY类型是在ORADBA用户下创建的,当前用户直接引用会找不到该类型。
修正后的代码
DECLARE MID varchar2(1000); BEGIN SELECT id INTO MID FROM ORADBA.AC -- 明确指定数据所在的Schema和表名 WHERE ID = '56' AND nbr IN (SELECT COLUMN_VALUE FROM TABLE(ORADBA.NBR_ARRAY('123'))); -- 若类型在ORADBA下,需添加Schema前缀 DBMS_OUTPUT.PUT_LINE('MID::' || MID); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('未找到匹配的数据'); END; /
关键说明
- 指定Schema与表名:将
FROM ac改为FROM ORADBA.AC,确保查询到正确的数据源。 - 类型引用规范:如果
NBR_ARRAY是在ORADBA用户下创建的,必须添加ORADBA.前缀,否则Oracle无法识别该自定义类型。 - 异常捕获:添加
EXCEPTION块捕获NO_DATA_FOUND异常,避免程序直接中断,同时输出友好提示。
内容的提问来源于stack exchange,提问作者Ajay Takur
相关产品推荐
相关产品推荐

