ORA-00947: 值不足

Posted

技术标签:

【中文标题】ORA-00947: 值不足【英文标题】:ORA-00947:not enough values 【发布时间】:2021-09-03 20:27:41 【问题描述】:

伙计们,我收到错误,PL/SQL: ORA-00947: no enough values while running my code.

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 ;
           ---dbms_output.put_line(emps(x).email);
           insert into emp(last_name,email,hire_date,job_id) values emps(x);
      end loop;
    end;

【问题讨论】:

不是说问题出在哪一行吗? ***.com/search?q=PL%2FSQL+ORA-00947 一个,但无论如何你应该在你的问题中包含一个minimal reproducible example。作为这里的新用户,也请带上tour并阅读How to Ask。 请编辑问题并显示表格定义 我的表 -EMPLOYEE_ID NUMBER(6),FIRST_NAME VARCHAR2(20),LAST_NAME NOT NULL VARCHAR2(25),EMAIL NOT NULL VARCHAR2(25),PHONE_NUMBER VARCHAR2(20),HIRE_DATE NOT NULL DATE, JOB_ID NOT NULL VARCHAR2(10), SALARY NUMBER(8,2) , COMMISSION_PCT NUMBER(2,2), MANAGER_ID NUMBER(6) , DEPARTMENT_ID NUMBER(4), 它的第 13 行,我试图将选定的列从一个表插入另一个表。当我选择所有列并尝试将它们从一个表插入到另一个表时。它允许我这样做,但是当我使用选定的列时,它会给我错误。两个表结构都是相同的,因为我使用 as 关键字创建表并通过取其新名称复制同一个表 【参考方案1】:

@WilliamRobertson 提出了一个有趣的解决方案(我实际上已经忘记了这种格式)。然而,仍然有一个更简单的解决方案。即使用一条sql语句进行select和insert,同时避免类型和变量声明以及循环:

insert into emp(last_name,email,hire_date,job_id) 
  select last_name,email,hire_date,job_id
    from employees  
   where employee_id between 100 and 110; 

【讨论】:

我知道这个查询兄弟,我只是想通过使用编码技能来做同样的事情,我只是想知道问题出在哪里,即使我以与我的记录相同的顺序使用相同的列,但即使然后当我选择整个表时它不允许插入然后它允许插入并且你的这个查询(插入到emp值emp(x)中给出相同的错误。【参考方案2】:

问题出在这里:

insert into emp(last_name,email,hire_date,job_id)
values emp(x);

values 子句使用记录变量的PL/SQL INSERT Statement Extension 不接受列列表,因此它必须是

insert into emp values emp(x);

其中emp(x) 求值为匹配整个emp 行的记录,否则

insert into
( select last_name, email, hire_date, job_id from emp )
values emp(x);

其中emp(x) 是与select 列表完全匹配的记录。

【讨论】:

以上是关于ORA-00947: 值不足的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00947: 值不足

ORA-00947: 在 Oracle 中创建对象时值不足

ORA-00947 当 UPDATE 返回 BULK COLLECT INTO 用户创建的 TYPE TABLE 时出现“没有足够的值”

尽管列和值匹配,Oracle 给我错误 ORA-00947

SQL 错误:ORA-00947:没有足够的值 - 尝试使用默认值

ORA-00947: 将值放入过程中的类型时没有足够的值