Onde está meu personagem inválido (ORA-00911)

Estou tentando inserir o CLOB em um database (veja a questão relacionada ). Eu não consigo entender o que está errado. Eu tenho uma lista de cerca de 85 clobs que quero inserir em uma tabela. Mesmo ao inserir apenas o primeiro clob, recebo o ORA-00911: invalid character . Eu não consigo descobrir como obter a declaração do PreparedStatement antes que ele seja executado, então não posso ter 100% de certeza de que está certo, mas se eu acertar, então deve ser exatamente assim:

 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; 

No final das insert all , essa insert all instruções teria muitos resources, e é por isso que simplesmente não faço uma instrução de insert regular. Eu não vejo um personagem inválido lá, não é? (Ah, e esse código acima roda bem quando eu corro na minha ferramenta de desenvolvimento sql .) E se eu remover o ponto-e-vírgula no PreparedStatement , ele lançará um erro ORA-00933: SQL command not properly ended .

Em todo caso, aqui está meu código para executar a consulta (e os valores das variables ​​para o exemplo acima).

 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; } 

Há algo que eu esteja perdendo um grande momento?

    Se você usar a string literal exatamente como você nos mostrou, o problema é o ; personagem no final. Você não pode include isso na string de consulta nas chamadas JDBC.

    Como você está inserindo apenas uma única linha, um INSERT regular deve ser bom mesmo ao inserir várias linhas. Usar uma instrução em lote é provavelmente mais eficiente anywy. Não há necessidade de INSERT ALL . Além disso, você não precisa do clob temporário e de tudo isso. Você pode simplificar seu método para algo assim (supondo que eu tenha os parâmetros certos):

     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(); 

    Do topo da minha cabeça, você pode tentar usar o operador ‘q’ para a string literal

    algo como

     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; 

    Note que as aspas simples do seu predicado não são escapadas, e a string fica entre q ‘[…]’.