[英]Bulk insert with forall syntax using PL/SQL
我曾經使用過T-SQL,但是目前我正在使用PL / SQL進行項目,因此語法有時會有所不同。
現在,我正在嘗試在數據庫中插入大約5000條記錄。 這將通過12個不同的連接進行。 (我讀取了12個XML不同的XML文件,並希望將每個XML的所有數據插入對應的表中)
我的第一個想法是為每個插入生成一個新的INSERT INTO
查詢,但是我猜這會帶來一些實際的性能問題。
接下來,我已經閱讀了有關將INSERT ALL INTO <table_name>
,但是我不確定這是否可以解決性能問題?
最后,我讀到,進行批量INSERT時, FORALL
會大大提高速度。 ( http://www.dba-oracle.com/oracle_news/news_plsql_forall_performance_insert.htm )
不幸的是,由於我對PLSQL的了解還不是很好,所以我不知道如何實現這一點。
我想做以下事情:
FORALL i IN 1..10
INSERT INTO DELETEME (ID, NAME) VALUES (i, 'name' + i);
這是我的表結構:
ID NUMBER(10,0)
NAME VARCHAR2(255 BYTE)
這就是我得到的:
Error starting at line : 2 in command -
INSERT INTO DELETEME (ID, NAME) VALUES (i, 'name' + i)
Error at Command Line : 2 Column : 61
Error report -
SQL Error: ORA-00984: column not allowed here
00984. 00000 - "column not allowed here"
*Cause:
*Action:
使用FORALL批量插入的最簡單方法是什么? 還是你們知道其他好的選擇?
您的代碼中有幾個錯誤。 一個是簡單的語法錯誤,請嘗試
... VALUES (i, 'name' || i);
在Oracle中,字符串由||
連接。 不是+
(不是&
)
除此之外, FORALL
用於PL / SQL表。 你可以這樣運行
DECLARE
TYPE nameTable IS TABLE OF INTEGER;
names nameTable;
BEGIN
names := nameTable(10,20,30,40);
FORALL i IN INDICES OF names
INSERT INTO DELETEME (ID, NAME) VALUES (names(i), 'name' ||names(i) );
END;
如果您只需要一個簡單的序列,也可以運行
INSERT INTO DELETEME (ID, NAME)
SELECT LEVEL, 'name' || LEVEL
FROM dual
CONNECT BY LEVEL <= 10;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.