首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何分割set值并在触发器PL/SQL中插入每一行?

如何分割set值并在触发器PL/SQL中插入每一行?
EN

Stack Overflow用户
提问于 2014-07-01 06:30:14
回答 2查看 1.3K关注 0票数 0

我有一张点菜桌。我需要之前插入订单表,创建和使用触发器插入提供以下格式。

示例:

问题:

id值

1 2,5,8

答:

id值

[经]1 2

1 5

1 8

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-01 11:51:30

Oracle中的触发器具有“而不是”模式,这正是您所需要的,但问题是您不能在一个简单的表上使用“而不是”触发器,它只能用于视图。因此,我为您看到的唯一选项是将您的表包装在视图中。例如,您有一张桌子:

代码语言:javascript
复制
create table my_table(c_id number, c_value varchar2(5))

重命名它并使用旧表的名称创建视图:

代码语言:javascript
复制
rename my_table to my_table_old;

create view my_table as select * from my_table_old;

所有对my_table的现有查询都应该使用此视图,包括更新和删除。现在我们可以创建而不是触发器:

代码语言:javascript
复制
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;

此层次结构查询将将逗号分隔的字符串转换为一行中具有单个值的表。

好的,让我们检查一下它是否有效:

代码语言:javascript
复制
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

简单的单值插入也可以:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-07-01 09:24:35

您可以修改regex以满足您的确切要求,但以下内容根据您的问题有效执行:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24503741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档