java - 将 CLOB 插入 Oracle 数据库

标签 java oracle jdbc insert clob

我的问题是:您如何绕过 ORA-01704: string literal too long使用 CLOB 插入(或在查询中执行任何操作)时出错是吗?

我想要这样的查询:

INSERT ALL
   INTO mytable VALUES ('clob1')
   INTO mytable VALUES ('clob2') --some of these clobs are more than 4000 characters...
   INTO mytable VALUES ('clob3')
SELECT * FROM dual;

当我用实际值尝试时,我得到了 ORA-01704: string literal too long背部。这很明显,但我如何插入 clob(或使用 clob 执行任何语句)?

我试过查看这个 question ,但我认为它没有我要找的东西。我的 clobs 在 List<String> 中然后我遍历它们以做出声明。我的代码如下:

private void insertQueries(String tempTableName) throws FileNotFoundException, DataException, SQLException, IOException {
String preQuery = "  into " + tempTableName + " values ('";
String postQuery = "')" + StringHelper.newline;
StringBuilder inserts = new StringBuilder("insert all" + StringHelper.newline);
List<String> readQueries = getDomoQueries();
for (String query : readQueries) {
  inserts.append(preQuery).append(query).append(postQuery);
}
inserts.append("select * from dual;");

DatabaseController.getInstance().executeQuery(databaseConnectionURL, inserts.toString());

public ResultSet executeQuery(String connection, String query) throws DataException, SQLException {
  Connection conn = ConnectionPool.getInstance().get(connection);
  Statement stmt = conn.createStatement();
  ResultSet rs = stmt.executeQuery(query);
  conn.commit();
  ConnectionPool.getInstance().release(conn);
  return rs;
}

最佳答案

您正在使它变得复杂。

为列表中的每个 clob 使用 PreparedStatement 和 addBatch():

String sql = "insert  into " + tempTableName + " values (?)";
PreparedStatement stmt = connection.prepareStatement(sql);
for (String query : readQueries) {
  stmt.setCharacterStream(1, new StringReader(query), query.lenght());
  stmt.addBatch();
}
stmt.exececuteBatch();

没有乱七八糟的转义字符串,没有文字长度的问题,不需要创建临时的 clob。而且很可能与使用单个 INSERT ALL 语句一样快。

如果您使用的是当前驱动程序 (> 10.2),那么我认为调用 setCharacterStream() 和创建 Reader 也不是必需的。一个简单的 setString(1, query) 很可能也能正常工作。

关于java - 将 CLOB 插入 Oracle 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10727521/

相关文章:

java - 打印应在命令行中提供大小的数组

java - 无法使 TableView 的 "Select All"CheckBox 工作 (JavaFX)

java - 使用多个输出参数调用 Oracle StoredProcedure

mysql - SQL 查询从两个表中选择并与第三个表进行比较

mysql - 尝试加载 jar 和外部类

java - 将 S3Client 升级到 S3AsyncClient 如何获取 Publisher<ByteBuffer>?

java - 无法让我的 DialogFragment 背景透明

mysql - 将相交从 Oracle 转换为 MySQL

java - 设置来自 Java 的 PostgreSQL JDBC 连接的连接选项

java - 未找到 JDBC Derby 驱动程序