Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 尝试获取一个ID(由触发器/序列生成),该ID在';插入';_Sql_Oracle_Plsql - Fatal编程技术网

Sql 尝试获取一个ID(由触发器/序列生成),该ID在';插入';

Sql 尝试获取一个ID(由触发器/序列生成),该ID在';插入';,sql,oracle,plsql,Sql,Oracle,Plsql,目前,我在值表上设置了一个触发器(带有序列),每当一行插入表中时,该触发器会自动生成一个新的值\u id。我试图将新值_id(由触发器/序列生成)返回到一个变量中,这样我就可以在以后的过程中将其插入到关系表中 但是,当我使用returning语句时,Oracle返回一个错误。当我使用传统的insert时,代码似乎运行/编译得很好 你知道我可能做错了什么吗?下面是我编写的代码的节略版本: insert into value (value_id, energy_product_id,

目前,我在值表上设置了一个触发器(带有序列),每当一行插入表中时,该触发器会自动生成一个新的值\u id。我试图将新值_id(由触发器/序列生成)返回到一个变量中,这样我就可以在以后的过程中将其插入到关系表中

但是,当我使用
returning
语句时,Oracle返回一个错误。当我使用传统的insert时,代码似乎运行/编译得很好

你知道我可能做错了什么吗?下面是我编写的代码的节略版本:

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;
提前谢谢

**编辑:**下面是讨论更改的代码。但是,它出错了:

insert into value 
  (value_id, 
   energy_product_id, 
   data_source_id, 
   unit_cd, 
   value_tx, 
   hr
  )
  select (select seq_sample.nextval from dual), 
         energy_product_id, 
         data_source_id, 
         unit_cd, 
         value_tx
  from value
  returning value_id into v_value_id;

似乎只有在insert具有
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,并使用bulk collect returning子句:

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;
但我不确定这是否可以保证。看起来应该是这样,但我不记得看到过有文件记录的


似乎应该有一个更直接的机制来实现这一点,但是…

如果insert有
value(…)
子句,则只能使用
返回到
子句,而不是使用查询

您可以改为使用集合:

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,并使用bulk collect returning子句:

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;
但我不确定这是否可以保证。看起来应该是这样,但我不记得看到过有文件记录的


似乎应该有一个更直接的机制来实现这一点,尽管…

我最近发布了一个关于如何将Insert转换为returning的问题,我相信@APC提供的答案将适用于您,如果他提到触发器将覆盖赋值,请尝试类似的方法

 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;

我最近发布了一个关于Insert into returning工作的问题,我相信@APC提供的答案将适用于您,如果他提到触发器将覆盖赋值,请尝试类似的方法

 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;

什么Oracle版本?请发布一条消息:您是否未使用序列生成值?11.2.0。我正在使用序列/触发器生成值。但我需要将该值返回到一个变量中,以便以后在另一次插入中使用它。@OldProgrammer我编辑了我的问题,谢谢大家的提醒。我是否按照该链接中的规定进行了正确的编辑?因此,不要使用触发器,而是在过程中获取seq.nextval,然后可以传递到多个insert。这是不正确的,因为这样我将获得插入的值之后的下一个值。我需要准确的数值。例如:(第一个表)Value\u ID(1)Value\u TX(5)--(第二个表)Value\u ID(1)Translation\u ID(1)CREATE\u DT(sysdate)。我需要“1”值\u id显示在两个表/插件中哪个Oracle版本?请发布一条消息:您是否未使用序列生成值?11.2.0。我正在使用序列/触发器生成值。但我需要将该值返回到一个变量中,以便以后在另一次插入中使用它。@OldProgrammer我编辑了我的问题,谢谢大家的提醒。我是否按照该链接中的规定进行了正确的编辑?因此,不要使用触发器,而是在过程中获取seq.nextval,然后可以传递到多个insert。这是不正确的,因为这样我将获得插入的值之后的下一个值。我需要准确的数值。例如:(第一个表)Value\u ID(1)Value\u TX(5)--(第二个表)Value\u ID(1)Translation\u ID(1)CREATE\u DT(sysdate)。我需要在两个表/insertsthank中都显示'1'值,是的,我可以使用传统的insert,但不能使用insert-to-select-from返回任何内容。。。(如果这是有意义的)在这种情况下,这个stackoverflow线程已经为您的问题指出了解决方案,看起来正是您要问的)啊。。。谢谢@prakriti,看起来我所问的是不可能的:(谢谢,是的,我可以得到一个传统的插入来工作,但不能插入到select from来返回任何东西…(如果有意义的话)在这种情况下,这个stackoverflow线程已经为您的问题指出了解决方案,看起来正是您所问的)啊。。。谢谢@prakriti,看来我所问的是不可能的:(