You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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块的结束标记/解析异常,同时原代码存在字符串写法错误:

  1. 字符串修正:Oracle中字符串必须用单引号,双引号用于引用区分大小写的标识符,所以"Yash"要改为'Yash',"Pune"改为'Pune'
  2. 执行模式调整:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:01:28