我有一個由大約150列組成的父表。我需要從父表中獲取記錄並將它們插入到11個不同的子表中,這些子表具有列名和數據類型。使用過程從一個表中將數據插入到多個表中
回答
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;
/
感謝上述答案,但實際上我需要在程序形式(作爲存儲過程)寫上述查詢,以便我可以編寫腳本。我不想每次都逐一添加或插入列。它應該像我每次運行程序時一樣,所有數據都應該自動插入。 – Aaryan
我追加了一個過程的例子。 – krokodilko
對不起,我試過,但它顯示一個錯誤,說PL/SQL; SQL語句被忽略並在附近顯示紅色標記以插入所有內容。你能否請告訴我接下來要做什麼。我也嘗試了逗號和分號,但無法糾正。 :( – Aaryan
- 1. 如何使用oracle過程從多個表中將數據插入到一個表中
- 2. 將數據從一個表插入到另一個表中
- 3. 將數據插入到多個表中
- 4. 將數據插入到多個表中
- 5. 從多個表中插入數據到一個表
- 6. 通過從多個表中選擇數據插入到一個表中
- 7. 將多個插入到一個表中
- 8. 如何使用SSIS將多個表中的數據插入到多個表中?
- 9. 使用外鍵將數據從一個表插入另一個表中從下拉菜單中插入數據
- 10. 使用另一個表的結果將數據插入到多個表中
- 11. 使用宏將數據從一個表插入另一個表
- 12. 用於將數據從一個表插入另一個表的另一個數據庫中的存儲過程
- 13. 使用一個查詢將數據插入到兩個表中
- 14. 將數據一次插入到多個數據庫和表中
- 15. 使用Oracle存儲過程在多個表中插入數據
- 16. 將多個數據插入到一個表中
- 17. 使用多個存儲過程將數據插入表
- 18. OpenJPA從另一個表插入到一個表中的數據
- 19. 將數據從一個表複製/插入到另一個表
- 20. 從多個程序插入數據到一個表是好的?
- 21. 將數據從一張表插入到MySQL中的多個表中
- 22. 如何在mysql中將數據從一個表插入到另一個表中?
- 23. 如何插入多個表中的數據到一個表
- 24. 使用linq將多個數據插入到不同的表中?
- 25. 使用grape API將數據插入到PostgreSQL的多個表中?
- 26. 插入選定的數據從多個表到一個表
- 27. 如何通過ItemWriter將數據插入到多個表中
- 28. 在第一個表中插入數據後,如何將數據從一個表插入另一個表?
- 29. 將多個表中的數據插入到一個單獨的表中
- 30. 從一個表數據插入數據到另一個表
我看不到PL/SQL的原因,普通的SQL會做。 – user272735
更具體。您是否希望數據相同,並在其他表格發生更改時顯示所有其他表格上的更改。或者在表格上分佈行。 (問Anubhav Srivastava) –
我只是想要數據是相同的,並顯示所有其他11表上的變化,當父(主)表中有變化。我不會手動做任何事情,有子表。 – Aaryan