我有一张订单表。我需要在插入订单表之前,创建并使用下面给出的格式的触发插入。
示例:
问题:
id值
1 2,5,8
答案:
id值
1 2
1 5
1 8
最佳答案
Oracle 中的触发器具有“INSTEAD OF”模式,这正是您所需要的,但问题是您不能在简单表上使用“INSTEAD OF”触发器,它仅适用于 View 。因此,我为您看到的唯一选择是将您的表格包装在 View 中。例如你有一张 table :
create table my_table(c_id number, c_value varchar2(5))
重命名并使用旧表名称创建 View :
rename my_table to my_table_old;
create view my_table as select * from my_table_old;
对 my_table 的所有现有查询都应适用于此 View ,包括更新和删除。现在我们可以创建 INSTEAD OF 触发器:
create or replace trigger t_my_table
instead of insert on my_table
for each row
declare
qid number;
begin
insert into my_table_old
select :new.c_id, regexp_substr (:new.c_value, '[^,]+', 1, level) as part
from dual
connect by level <= length (regexp_replace (:new.c_value, '[^,]+')) + 1;
end;
此层次结构查询会将逗号分隔的字符串转换为连续具有单个值的表。
好的,让我们检查一下它是否有效:
SQL> insert into my_table values (1, '2,5,8');
1 row created.
SQL> select * from my_table;
C_ID C_VALUE
---------- ---------------
1 2
1 5
1 8
简单的单值插入也可以工作:
SQL> insert into my_table values (2, '100');
1 row created.
SQL> select * from my_table;
C_ID C_VALUE
---------- ---------------
1 2
1 5
1 8
2 100
请注意,使用触发器会稍微影响插入查询的性能。
关于mysql - 如何在触发器PL/SQL中拆分设置值并插入每一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24503741/