mysql - 如何在触发器PL/SQL中拆分设置值并插入每一行?

标签 mysql plsql triggers

我有一张订单表。我需要在插入订单表之前,创建并使用下面给出的格式的触发插入
示例:
问题:

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/

相关文章:

oracle - 基于函数的索引和 user_tab_cols

linux - 使用 Oracle PL/SQL SP 在不同的 Linux 服务器上运行 Shell 脚本

sql - 如何识别触发了哪个触发器(更新或删除)

c# - c#写mysql建表查询的方法

plsql - 错误(36,1): PLS-00103: Encountered the symbol "SET"

php - MySQL 使并发 SELECT ... FOR UPDATE 查询失败而不是等待锁被释放

oracle - 仅当存在时才删除触发器 (ORACLE)

Jquery - 如何触发 $ ('#myForm' ).submit(function()

mysql - 编写一个大的 sql 查询还是通过代码处理它?

mysql - 当我执行 INSERT 时,MySQL 内部会发生什么?