在“插入”之后,尝试获取返回到变量的ID(由触发器/序列生成)

时间:2018-06-19 18:41:15

标签: sql oracle plsql

我目前在VALUE表上设置了一个触发器(带有序列),每次将一行插入表时都会自动生成一个新的value_id。我试图将新的value_id(由触发器/序列生成)返回到变量中,以便稍后在proc中插入关系表中时可以使用它。

但是,当我使用*string_ptr语句时,Oracle返回一个错误。当我使用传统插入时,代码似乎可以运行/编译。

您知道我可能做错了吗?以下是我编写的代码的简化版本:

returning

预先感谢

**编辑:**以下是讨论的更改的代码。但是会出错:

insert into value 
  (value_id, 
   energy_product_id, 
   data_source_id, 
   unit_cd, 
   value_tx, 
   hr
  )
  select null, 
         energy_product_id, 
         data_source_id, 
         unit_cd, 
         value_tx
  from value
  returning value_id into v_value_id;

2 个答案:

答案 0 :(得分:1)

如果插入内容中有returning into子句,似乎只能使用values (...)子句,如果您使用的是查询,则不能使用。

您可以改用集合:

declare
  type t_rows is table of value_table%rowtype;
  v_rows t_rows;
begin
  select seq_sample.nextval, 
         energy_product_id, 
         data_source_id, 
         unit_cd, 
         value_tx, hr
  bulk collect into v_rows
  from value_table;

  forall i in 1..v_rows.count
    insert into value_table values v_rows(i);

  -- just as debug to see new ID values
  for i in 1..v_rows.count loop
    dbms_output.put_line(v_rows(i).value_id);
  end loop;
end;
/

如果您想保留触发器,并且它会覆盖任何传入的值-这是正常现象,但可能是例外情况-那么您可以使用第二个集合来获取ID,带有批量收集返回子句:

declare
  type t_rows is table of value_table%rowtype;
  v_rows t_rows;
  type t_ids is table of number;
  v_ids t_ids;
begin
  select null, 
         energy_product_id, 
         data_source_id, 
         unit_cd, 
         value_tx, hr
  bulk collect into v_rows
  from value_table;

  forall i in 1..v_rows.count
    insert into value_table values v_rows(i)
    returning value_id bulk collect into v_ids;

  -- just as debug to see new ID values
  for i in 1..v_ids.count loop
    dbms_output.put_line(v_ids(i));
  end loop;
end;
/

ID的索引应与其他行数据的索引对应,因此您可以更新原始集合:

  for i in 1..v_rows.count loop
    v_rows(i).value_id := v_ids(i);
  end loop;

但是我不确定是否可以保证。似乎应该是 ,但我不记得看到过记录。

虽然似乎应该有一个更简单的机制来实现这一目标...

答案 1 :(得分:1)

我最近发布了一个关于插入返回的工作的问题,我相信@APC提供的答案将对您有用,在这种情况下,他提到触发器将覆盖https://stackoverflow.com/a/50892580/7071906分配的值,请尝试类似

 declare
 select  CURSOR c1 IS
 SELECT 1 val,energy_product_id,data_source_id,unit_cd,value_tx from 
  value
 lrec c1%rowtype;
 ldata c1%rowtype;
id number;
 begin
fetch c1 into lrec

ldata.value_id := lrec.id;
ldata.energy_product_id := lrec.energy_product_id;
ldata.unit_cd := lrec.unit_cd;
ldata.value_tx :=  lrec.value_tx;

INSERT INTO my_table
VALUES ldata
RETURNING val1 INTO id;
end;

How does Oracle Insert Into work when order of values is not defined?