我有一个包含大约150列的父表。我需要从父表中获取记录并将它们插入到11个不同的子表中,这些子表具有列名和数据类型。
答案 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;
/