oracle 使用Forall向具有标识列的表中进行大容量插入,导致“值不足”错误

ogsagwnx  于 2022-11-03  发布在  Oracle
关注(0)|答案(1)|浏览(100)

我们有一个标识列为dm_id的表。Create语句如下所示:

create table DM_HR_TURNS_IN_OUT_HOURS
(
  dm_id       number generated always as identity,
  action_id   NUMBER ,
  turns_emp_id NUMBER,
  action_date DATE,
  action_type VARCHAR2(2),
  log_id      NUMBER(12),
  action_day  date,
  action_Type_name varchar2(60),
  hr_emp_id        number(10),
  filial           varchar2(5),
  first_name          VARCHAR2(70),
  last_name           VARCHAR2(70),
  middle_name         VARCHAR2(70)
)

在一个过程中,有一个游标可以选择源表中的所有列(标识列除外)。然后,在为提取游标的变量创建类型时,将使用该游标:

Cursor c1 is 
  select    

        t.id action_id, 
        t.emp_id turns_emp_id,
        t.action_date,
        t.action_type,
        t.log_id,
        trunc(action_date) action_day,
        decode(t.action_type, 'I', 'In','O','Out') action_type_name,
        e.hr_emp_id,
        e.filial,
        e.first_name,
        e.last_name,        
        e.middle_name
 from ibs.hr_turnstile_emps e ,
      ibs.hr_turns_in_out_hours t
 where  e.turns_emp_id = t.emp_id;

 type t_hr_hours is table of c1%rowtype;
 v_turn_hours t_hr_hours := t_hr_hours();

现在代码如下所示:

if c1 %isopen then 
      close c1;
    end if;
    open c1;
    loop
      fetch c1 bulk collect 
      into v_turn_hours limit 100000;
     exit when(v_turn_hours.count = 0) ;
    forall i in v_turn_hours.first .. v_turn_hours.last
    insert into dm_hr_turns_in_out_hours( action_id,turns_emp_id,action_date, action_Type,log_id, action_day,
                                         action_Type_name, hr_emp_id, filial, first_name, last_name, middle_name)                                                        
     values (v_turn_hours (i));    

    end loop; 
    close c1;
    commit;

我越来越
ORA-00947-值(v_turn_hours(i))处的值不足错误;
即使我已经在insert语句中指定了所有的普通列,我还是无法运行插入。理想情况下,标识列应该已经生成了序列号。错误的原因可能是什么?

1zmg4dgp

1zmg4dgp1#

如果不是手动插入 identity 列的值,那么根本就不应该在insert中指定该列,而且应该指定要插入的单独值。
我没有您的表,因此我将基于Scott的示例模式创建一个示例。
这是包含标识列的目标表:

SQL> create table target
  2    (dm_id    number generated always as identity,
  3     ename    varchar2(10),
  4     job      varchar2(15));

Table created.

PL/SQL代码;注意第13行和第14行,它们显示了我之前解释的内容:

SQL> declare
  2    cursor c1 is
  3      select ename, job
  4        from emp
  5        where deptno = 10;
  6    type t_hr_hours is table of c1%rowtype;
  7    v_turn_hours t_hr_hours := t_hr_hours();
  8  begin
  9    open c1;
 10    fetch c1 bulk collect into v_turn_hours;
 11
 12    forall i in v_turn_hours.first .. v_turn_hours.last
 13      insert into target (ename, job)
 14        values (v_turn_hours(i).ename, v_turn_hours(i).job);
 15    close c1;
 16  end;
 17  /

PL/SQL procedure successfully completed.

结果:

SQL> select * From target;

     DM_ID ENAME      JOB
---------- ---------- ---------------
         1 CLARK      MANAGER
         2 KING       PRESIDENT
         3 MILLER     CLERK

SQL>

相关问题