簡體   English   中英

使用PL / SQL使用forall語法進行批量插入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM