2013-10-04 97 views
-2

我有一個由大約150列組成的父表。我需要從父表中獲取記錄並將它們插入到11個不同的子表中,這些子表具有列名和數據類型。使用過程從一個表中將數據插入到多個表中

+0

我看不到PL/SQL的原因,普通的SQL會做。 – user272735

+0

更具體。您是否希望數據相同,並在其他表格發生更改時顯示所有其他表格上的更改。或者在表格上分佈行。 (問Anubhav Srivastava) –

+0

我只是想要數據是相同的,並顯示所有其他11表上的變化,當父(主)表中有變化。我不會手動做任何事情,有子表。 – Aaryan

回答

1

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

上述命令使用SELECT ... FROM ...檢索來自parent表中的所有行(在底部) ,那麼對於每個檢索到的記錄,它將執行所有INSERT ...語句。
如果SELECT子句也有WHERE conditions子句,那麼只有滿足這些條件的行纔會被插入。

該示例中的查詢的INSERT部分可以具有各種形式:

  • 完整形式與源和目標表的顯式地definied列:

    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; 

鏈接到演示:--->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

這裏,爲每個源行,甲骨文評估條件從上到下,當某些條件成立時,然後執行只測試這一個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; 
/
+0

感謝上述答案,但實際上我需要在程序形式(作爲存儲過程)寫上述查詢,以便我可以編寫腳本。我不想每次都逐一添加或插入列。它應該像我每次運行程序時一樣,所有數據都應該自動插入。 – Aaryan

+0

我追加了一個過程的例子。 – krokodilko

+0

對不起,我試過,但它顯示一個錯誤,說PL/SQL; SQL語句被忽略並在附近顯示紅色標記以插入所有內容。你能否請告訴我接下來要做什麼。我也嘗試了逗號和分號,但無法糾正。 :( – Aaryan

相關問題