我目前在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;
答案 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?