当前位置: 首页 > 知识库问答 >
问题:

通过JDBC执行长insert语句

米俊喆
2023-03-14

我有一个结构为INSERT语句的备份文件。我的方法是编写一个方法从文件中加载这些语句,并使用JDBC模板执行它们。

public void restoreFile(File f) throws Exception {
    LineIterator it = FileUtils.lineIterator(f, "UTF-8");
    try {
        while (it.hasNext()) {
            String insertStatement = it.nextLine();
            if (!insertStatement.startsWith("--") && !insertStatement.isEmpty()) {
                insertStatement = insertStatement.replace(";", "");
                executeSqlStatement(insertStatement);
            }
        }
    } finally {
        it.close();
    }
}

public void executeSqlStatement(String sqlStatement) throws Exception {

    PreparedStatementCreator statement = new PreparedStatementCreator() {
        @Override
        public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
            PreparedStatement statement = connection.prepareStatement(sqlStatement);
            return statement;
        }
    };
    getJdbcTemplate().update(statement);
}
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-01704: string literal too long

编辑:另外,SQL Developer如何处理这些长字符串文本?

共有1个答案

秦毅
2023-03-14

黑客来了:

public void executeSqlStatement(String sqlStatement) throws Exception {

    PreparedStatementCreator statement = new PreparedStatementCreator() {
        @Override
        public PreparedStatement createPreparedStatement(Connection connection)
                    throws SQLException {
            List<String> params = new ArrayList<>();
            if (sqlStatement.length() >= 4000) {
                Pattern pattern = Pattern.compile("'(([^'\n]|'')+)'");
                Matcher m = pattern.matcher(sqlStatement);
                StringBuffer sb = new StringBuffer();
                while (m.find()) {
                    params.add(m.group(1).replace("''", "'"));
                    m.appendReplacement(sb, "?");
                }
                m.appendTail(sb);
                sqlStatement = sb.toString();
            }
            PreparedStatement statement = connection.prepareStatement(sqlStatement);
            for (int i = 0; i < params.size(); ++i) {
                statement.setString(1 + i, params[i]);
            }
            return statement;
        }
    };
    getJdbcTemplate().update(statement);
}

如您所见:它试图通过提取字符串文本来缩小较大的SQL。

 类似资料:
  • 我真的需要帮助,我在stackoverflow上找到的所有问题中都搜索到了,但没有任何效果。我以前从未使用过hibernate,我不知道自己做错了什么 这是我的存储库:https://github.com/ionutincau/test_db 我收到了这个错误:

  • 我在使用以下方言创建表时遇到以下错误 “org.hibernate.dialoget.mysqlinoddDialogic”

  • 问题内容: 我真的需要帮助,我在关于stackoverflow的所有问题中进行了搜索,但没有任何效果。我以前从未使用过hibernate模式,也不知道自己在做什么错。 这是我的存储库:https : //github.com/ionutincau/test_db 我收到此错误: 问题答案: 在您的CFG文件中,请更改hibernate方言

  • 问题内容: 我正在尝试使用MySQLdb从Python脚本在MySQL表上执行基本语句。我的桌子看起来像这样: 从MySQL命令行运行此查询可以正常工作: 但是,当我尝试从Python脚本执行查询时,不会插入任何行。这是我的代码: 奇怪的是,这将显示“插入的行数:1”。我还可以确认此查询增加了ID字段,因为当我通过命令行添加另一行时,其ID的值与Python脚本已成功插入其行的值相同。但是,运行查

  • 下面给出一个例子来演示一下如何使用JDBC来执行各种SQL语句,其中包括DDL语句(建立数据库和数据表)、INSERT语句和SELECT语句。 1.程序分析说明 本程序首先创建一个mydb数据库(如果存在就不创建),然后创建一个用于保存图书信息的表t_books(如果存在,删除后再创建),最后向表中插入两条记录,并查询和显示其中的第2条记录。 2.代码编写 本程序使用了Statement接口的ex

  • 问题内容: 我需要对CSV文件(以逗号分隔的文本文件)应用SQL查询。我的SQL是通过其他工具预定义的,无法更改。它可能在FROM部分中包含嵌入式选择和表别名。 对于我的任务,我发现了两个提供JDBC驱动程序 的开源 库(这是项目要求): CsvJdbc XlSQL JBoss Teiid 创建一个Apache Derby DB,将所有CSV加载为表格并执行查询。 这些是我遇到的问题: 它不接受S