使用过程将数据从一个表插入多个表

时间:2013-10-04 13:52:06

标签: oracle plsql

我有一个包含大约150列的父表。我需要从父表中获取记录并将它们插入到11个不同的子表中,这些子表具有列名和数据类型。

1 个答案:

答案 0 :(得分:2)

Oracle有一个非常方便的INSERT ALL命令,在这种情况下可以提供帮助。

无条件版本的语法为:

INSERT ALL
  INTO child1( col1, col2, col3 ) VALUES( col1, col2, col3 )
  INTO child2 VALUES( col1, col2, col3 )
  INTO child3 ( col1, col2, col3 )
  INTO child4
SELECT col1, col2, col3
FROM parent
-- WHERE some conditions;

演示链接: - > http://sqlfiddle.com/#!4/3eb62/1

上面的命令使用parent(在底部)检索SELECT ... FROM ...表中的所有行,然后,对于每个检索到的记录,它执行所有INSERT ...语句。
如果SELECT子句也有WHERE conditions子句,则只插入符合这些条件的行。

示例中查询的INSERT部分可以有多种形式:

  • 包含明确定义的源表和目标表列的完整表单:

    INTO dest_table( destcol1, ... destcolN ) VALUES (sourcecol1, ..., sourcecolN)

  • 缩写形式,其中只提供源表中的列

    INTO dest_table VALUES (sourcecol1, ..., sourcecolN)

  • 另一个缩写形式,其中只提供目标表中的列

    INTO dest_table( destcol1, ... destcolN )

  • 或最简单的:

    INTO dest_table


INSERT ALL还有条件版本:

INSERT ALL
  WHEN 1=1 THEN INTO child1( col1, col2, col3 ) VALUES( col1, col2, col3 )
  WHEN col1 <> 2 THEN INTO child2 VALUES( col1, col2, col3 )
  WHEN col3 < 3 THEN INTO child3 ( col1, col2, col3 )
  WHEN col2 = 'rec 3' THEN INTO child4
SELECT col1, col2, col3
FROM parent;

演示链接:---&gt; http://sqlfiddle.com/#!4/e7da3/1

此版本仅在满足WHEN子句后指定的条件时才插入行。
对于每个选定的行,始终会评估所有条件。



还有另一种条件形式:INSERT FIRST

INSERT FIRST
  WHEN col1 >= 4 THEN INTO child1( col1, col2, col3 ) VALUES( col1, col2, col3 )
  WHEN col1 >= 3 THEN INTO child2 VALUES( col1, col2, col3 )
  WHEN col1 >= 2 THEN INTO child3 ( col1, col2, col3 )
  WHEN col1 >= 1 THEN INTO child4
SELECT col1, col2, col3
FROM parent;

演示的链接:http://sqlfiddle.com/#!4/a421e/1

这里,对于每个源行,Oracle从上到下评估条件,当某些条件为真时,则只执行这一个INSERT语句,并跳过剩余的插入。




-------编辑-------

如何以程序方式执行此操作的示例:

CREATE OR REPLACE PROCEDURE name
AS
BEGIN
   INSERT ALL
      INTO child1( col1, col2, col3 ) VALUES( col1, col2, col3 )
      INTO child2 VALUES( col1, col2, col3 )
      INTO child3 ( col1, col2, col3 )
      INTO child4
   SELECT col1, col2, col3
   FROM parent ;
   -- if commit is required, place it here
   -- COMMIT;
END;
/