运行PL/SQL代码报ORA-00947:not enough values错误如何解决
ORA-00947 PL/SQL报错问题解决
报错原因
INSERT语句的字段数量与传入值数量不匹配是核心诱因:代码中insert into emp(last_name,email,hire_date,job_id)指定了4个待插入字段,而后续values emps(x)中的emps(x)是自定义的复合记录类型,Oracle会将其识别为1个独立值,系统判定仅传入1个值,与需要的4个值数量不符,因此抛出ORA-00947: not enough values错误。- 额外说明:即使省略字段列表直接写
insert into emp values emps(x),也需要满足两个前提才可以运行:一是emp表的字段顺序、数量、类型与自定义的e_type记录完全一致;二是数据库为Oracle 12c及以上版本,更低版本不支持在VALUES子句中直接使用记录类型插入数据。
修复方案
方案一:显式拆分记录属性传值(全版本兼容,推荐)
将插入语句改为逐个取出记录的属性对应传入,修改后的完整可运行代码如下:
declare type e_type is record ( last_name employees.last_name%type, email employees.email%type, hire_date employees.hire_date%type, job_id employees.job_id%type); type e_list is table of e_type index by pls_integer; emps e_list; begin for x in 100 .. 110 loop select last_name,email,hire_date,job_id into emps(x) from employees where employee_id = x; -- 拆分记录属性逐个传值,与前面的字段列表一一对应 insert into emp(last_name,email,hire_date,job_id) values (emps(x).last_name, emps(x).email, emps(x).hire_date, emps(x).job_id); end loop; end; /
方案二:直接使用记录插入(仅Oracle 12c+可用)
如果确认你的emp表的字段顺序、数量、类型和e_type完全匹配,可以直接省略字段列表传入记录变量,写法如下:
insert into emp values emps(x);
内容的提问来源于stack exchange,提问作者Aman
相关产品推荐
相关产品推荐

