使用PL / SQL

时间:2018-03-26 07:43:17

标签: c# oracle plsql

我曾经使用过T-SQL,但目前我正在使用PL / SQL开发一个项目,所以语法有时会有所不同。

现在,我试图在数据库中插入大约5000条记录。这将通过12个不同的连接发生。 (我读了12个XML不同的XML文件,我想在相应的表中插入每个XML的所有数据)

我的第一个想法是为每个插页生成一个新的INSERT INTO查询,但我猜这会给出一些真正的性能问题。

接下来我已经阅读了INSERT ALL INTO <table_name>,但我不确定这是否会解决性能问题?

最后,我已经读过FORALL会在进行批量INSERT时大幅提高速度。 (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批量插入最简单的方法是什么? 或者你们知道任何好的选择吗?

1 个答案:

答案 0 :(得分:1)

您的代码中有多处错误。一个是简单的语法错误,请尝试

... 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;