Dov’è il mio personaggio non valido (ORA-00911)

Sto cercando di inserire CLOB in un database (vedi domanda correlata ). Non riesco a capire cosa c’è che non va. Ho una lista di circa 85 clob che voglio inserire in una tabella. Anche inserendo solo il primo clob ottengo ORA-00911: invalid character . Non riesco a capire come ottenere la dichiarazione dal PreparedStatement prima che venga eseguita, quindi non posso essere sicuro al 100% che sia giusto, ma se ho capito bene, dovrebbe apparire esattamente come questo:

 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; 

In definitiva, questa frase di insert all istruzioni dovrebbe avere molto into s, motivo per cui non faccio una semplice istruzione di insert . Non vedo un personaggio non valido lì dentro, vero? (Oh, e quel codice sopra funziona bene quando lo eseguo nel mio strumento sql per sviluppatori .) E se rimuovo il punto e virgola in PreparedStatement , lancia un ORA-00933: SQL command not properly ended errore.

In ogni caso, ecco il mio codice per l’esecuzione della query (e i valori delle variabili per l’esempio sopra).

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

C’è qualcosa che mi manca alla grande?

    Se usi la stringa letterale esattamente come ci hai mostrato, il problema è il ; personaggio alla fine. Non è ansible includerlo nella stringa di query nelle chiamate JDBC.

    Poiché stai inserendo solo una singola riga, un normale INSERT dovrebbe essere perfetto anche quando inserisci più righe. L’utilizzo di una dichiarazione in batch è probabilmente più efficace in ogni caso. Non è necessario INSERT ALL . Inoltre non è necessario il clob temporaneo e tutto il resto. Puoi semplificare il tuo metodo per qualcosa di simile (assumendo che ho ottenuto i parametri corretti):

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

    In cima alla mia testa, puoi provare a usare l’operatore ‘q’ per la stringa letterale

    qualcosa di simile a

     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; 

    Si noti che le virgolette singole del predicato non sono sfuggite e la stringa si trova tra q ‘[…]’.