id值
1 2,5,8
答案:
id值
1 2
1 5
1 8
答案 0 :(得分:1)
Oracle中的触发器具有模式" INSTEAD OF"这正是你所需要的,但问题是你不能使用" INSTEAD OF"触发一个简单的表,它只适用于视图。因此,我看到的唯一选择是将表包装在视图中。例如,你有一张表:
create table my_table(c_id number, c_value varchar2(5))
重命名并使用旧表创建视图'名:
rename my_table to my_table_old;
create view my_table as select * from my_table_old;
对my_table的所有现有查询都应该适用于此视图,包括更新和删除。现在我们可以创建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
请注意,使用触发器会影响插入查询的性能。
答案 1 :(得分:0)
您可以修改正则表达式以满足您的确切要求,但以下内容可根据您的问题有效执行:
CREATE OR REPLACE TRIGGER XX_ORDER_TRG
BEFORE INSERT ON XX_ORDER_TBL
FOR EACH ROW
DECLARE
l_num1 NUMBER;
l_num2 NUMBER;
l_num3 NUMBER;
BEGIN
/* If the whole string in value matches 3 single digits separated by commas */
IF REGEXP_LIKE(:new.value,'^(\d{1},\d{1},\d{1})$') THEN
/* Split the value into its 3 separate digits - Capture Groups are not supported natively*/
l_num1 := REGEXP_SUBSTR(:new.value,'\d{1}',1,1);
l_num2 := REGEXP_SUBSTR(:new.value,'\d{1}',1,2);
l_num3 := REGEXP_SUBSTR(:new.value,'\d{1}',1,3);
:new.value := l_num1;
INSERT INTO XX_TBL (id, value) VALUES (:new.id, l_num2);
INSERT INTO XX_TBL (id, value) VALUES (:new.id, l_num3);
END IF;
END;