我曾经使用过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批量插入最简单的方法是什么? 或者你们知道任何好的选择吗?
答案 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;