我的无效字符(ORA-00911)在哪里?

我试图将CLOB插入到数据库中(请参阅相关问题 )。 我无法弄清楚什么是错的。 我有一个约85个clob我想插入表中的列表。 即使只插入第一个clob我得到ORA-00911: invalid character 。 我无法弄清楚如何在PreparedStatement之前将语句从执行前的语句中提取出来,所以我不能100%确定它是正确的,但是如果我把它正确的话,应该看起来像这样:

 insert all into domo_queries values ('select substr(to_char(max_data),1,4) as year, substr(to_char(max_data),5,6) as month, max_data from dss_fin_user.acq_dashboard_src_load_success where source = ''CHQ PeopleSoft FS''') select * from dual; 

最终,这个insert all语句将有很多的,这就是为什么我只是不做一个定期的insert语句。 我在那里看不到一个无效的angular色,是吗? (哦,上面的代码运行良好,当我在我的sql开发工具中运行它 。)而我如果我删除PreparedStatement的分号,它会抛出一个ORA-00933: SQL command not properly ended错误。

在任何情况下,这里是我执行查询的代码(以及上面例子中variables的值)。

 public ResultSet executeQuery(String connection, String query, QueryParameter... params) throws DataException, SQLException { // query at this point = "insert all //into domo_queries values (?) //select * from dual;" Connection conn = ConnectionPool.getInstance().get(connection); PreparedStatement pstmt = conn.prepareStatement(query); for (int i = 1; i <= params.length; i++) { QueryParameter param = params[i - 1]; switch (param.getType()) { //The type in the example is QueryParameter.CLOB case QueryParameter.CLOB: Clob clob = CLOB.createTemporary(conn, false, oracle.sql.CLOB.DURATION_SESSION); clob.setString(i, "'" + param.getValue() + "'"); //the value of param.getValue() at this point is: /* * select * substr(to_char(max_data),1,4) as year, * substr(to_char(max_data),5,6) as month, * max_data * from dss_fin_user.acq_dashboard_src_load_success * where source = ''CHQ PeopleSoft FS'' */ pstmt.setClob(i, clob); break; case QueryParameter.STRING: pstmt.setString(i, "'" + param.getValue() + "'"); break; } } ResultSet rs = pstmt.executeQuery(); //Obviously, this is where the error is thrown conn.commit(); ConnectionPool.getInstance().release(conn); return rs; } 

有什么我只是错过了大好时光?

如果你完全按照你所说的那样使用string,问题就在于; 字符在最后。 您可能不会在JDBC调用的查询string中包含该字段。

由于您只插入一行,所以即使在插入多行时,也应该正常插入。 使用批量声明可能更有效率。 不需要INSERT ALL 。 另外你不需要临时的clob和所有的。 你可以简化你的方法是这样的(假设我有正确的参数):

 String query1 = "select substr(to_char(max_data),1,4) as year, " + "substr(to_char(max_data),5,6) as month, max_data " + "from dss_fin_user.acq_dashboard_src_load_success " + "where source = 'CHQ PeopleSoft FS'"; String query2 = "....."; String sql = "insert into domo_queries (clob_column) values (?)"; PreparedStatement pstmt = con.prepareStatement(sql); StringReader reader = new StringReader(query1); pstmt.setCharacterStream(1, reader, query1.length()); pstmt.addBatch(); reader = new StringReader(query2); pstmt.setCharacterStream(1, reader, query2.length()); pstmt.addBatch(); pstmt.executeBatch(); con.commit(); 

在我的头顶,你可以尝试使用string文字的'q'运算符

就像是

 insert all into domo_queries values (q'[select substr(to_char(max_data),1,4) as year, substr(to_char(max_data),5,6) as month, max_data from dss_fin_user.acq_dashboard_src_load_success where source = 'CHQ PeopleSoft FS']') select * from dual; 

请注意,谓词的单引号不会被转义,string位于q'[…]'之间。