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

Oracle中statement.executeUpdate()无法批量插入,求常规SQL替代方案

Oracle数据库批量插入的常规SQL方法

你原来的写法在H2中可行,是因为H2允许在单个Statement中执行多条分号分隔的SQL语句,但Oracle默认不支持这种方式,所以需要换用以下几种常规方法实现批量插入:

方法一:多值INSERT语法(Oracle 12c+支持)

这是接近标准SQL的写法,一次性插入多条记录,语法简洁:

INSERT INTO PERSON (NAME, AGE)
VALUES 
    ('张三', 25),
    ('Susan', 20)

对应的Java代码(推荐用PreparedStatement避免SQL注入):

// 预编译SQL,避免字符串拼接带来的注入风险
String sql = "INSERT INTO PERSON (NAME, AGE) VALUES (?, ?), (?, ?)";
PreparedStatement pstmt = connection.prepareStatement(sql);

pstmt.setString(1, name);
pstmt.setInt(2, age);
pstmt.setString(3, "Susan");
pstmt.setInt(4, 20);

int success = pstmt.executeUpdate();

方法二:INSERT ALL语法(Oracle特有)

适合批量插入到同一张或多张表的场景,灵活性更高:

INSERT ALL
    INTO PERSON (NAME, AGE) VALUES ('张三', 25)
    INTO PERSON (NAME, AGE) VALUES ('Susan', 20)
SELECT * FROM DUAL;

对应的Java代码:

String sql = "INSERT ALL " +
             "INTO PERSON (NAME, AGE) VALUES (?, ?) " +
             "INTO PERSON (NAME, AGE) VALUES (?, ?) " +
             "SELECT * FROM DUAL";
PreparedStatement pstmt = connection.prepareStatement(sql);

pstmt.setString(1, name);
pstmt.setInt(2, age);
pstmt.setString(3, "Susan");
pstmt.setInt(4, 20);

int success = pstmt.executeUpdate();

方法三:JDBC批量执行(通用兼容)

这是JDBC标准的批量操作方式,兼容性强,适合大量数据插入,性能更优:

String sql = "INSERT INTO PERSON (NAME, AGE) VALUES (?, ?)";
PreparedStatement pstmt = connection.prepareStatement(sql);

// 添加第一条记录到批量队列
pstmt.setString(1, name);
pstmt.setInt(2, age);
pstmt.addBatch();

// 添加第二条记录到批量队列
pstmt.setString(1, "Susan");
pstmt.setInt(2, 20);
pstmt.addBatch();

// 执行批量更新,返回每条记录的执行结果
int[] successCounts = pstmt.executeBatch();
// 可遍历successCounts统计总成功条数

注意:避免直接拼接SQL字符串,这种写法存在严重的SQL注入风险,始终优先使用PreparedStatement预编译SQL。

内容的提问来源于stack exchange,提问作者ivoronline

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:33:25