Oracle 12c批量插入遇PLS-00103错误,求可行替代方案
Oracle 12c批量插入问题与替代方案
问题详情
在DBVisualizer中执行以下PL/SQL代码尝试批量插入50条数据到customers表:
BEGIN FOR counter_var IN 1..50 LOOP INSERT INTO customers VALUES (counter_var,"Yash","Pune",0,0); END LOOP; COMMIT; END; /
触发错误:
[Code: 6550, SQL State: 65000] ORA-06550: line 4, column 59:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
;
[Script position: 99 - 100]
将字符串的双引号改为单引号后,错误依然存在。
原代码错误修复
这个错误核心是DBVisualizer对PL/SQL块的结束标记/解析异常,同时原代码存在字符串写法错误:
- 字符串修正:Oracle中字符串必须用单引号,双引号用于引用区分大小写的标识符,所以
"Yash"要改为'Yash',"Pune"改为'Pune' - 执行模式调整:在DBVisualizer中切换到PL/SQL执行模式,确保解析器正确识别
/作为PL/SQL块的结束标记;或者在/前添加空行,避免解析器误判
Oracle 12c批量插入的其他高效方法
1. 层级查询生成数据插入
无需循环,通过CONNECT BY快速生成序列数据:
INSERT INTO customers (id, name, city, col1, col2) SELECT ROWNUM, 'Yash', 'Pune', 0, 0 FROM DUAL CONNECT BY ROWNUM <= 50; COMMIT;
2. INSERT ALL语句
适合插入固定批量数据:
INSERT ALL INTO customers VALUES (1, 'Yash', 'Pune', 0, 0) INTO customers VALUES (2, 'Yash', 'Pune', 0, 0) -- 依次添加至50条记录 SELECT * FROM DUAL; COMMIT;
3. FORALL批量插入(PL/SQL高效方式)
利用集合和FORALL提升批量插入效率,适合复杂数据场景:
DECLARE TYPE CustTableType IS TABLE OF customers%ROWTYPE; cust_records CustTableType := CustTableType(); BEGIN FOR i IN 1..50 LOOP cust_records.EXTEND; cust_records(i).id := i; cust_records(i).name := 'Yash'; cust_records(i).city := 'Pune'; cust_records(i).col1 := 0; cust_records(i).col2 := 0; END LOOP; FORALL idx IN cust_records.FIRST..cust_records.LAST INSERT INTO customers VALUES cust_records(idx); COMMIT; END; /
4. SQL*Loader/外部表导入
如果是超大数据量批量导入,使用Oracle官方工具SQL*Loader,将外部文件数据直接导入表中,这是性能最优的批量导入方案之一。
内容的提问来源于stack exchange,提问作者yash bhangare
相关产品推荐
相关产品推荐

