Estoy tratando de insertar CLOB
s en una base de datos (consulte related question). No puedo entender lo que está mal. Tengo una lista de aproximadamente 85 clobos que quiero insertar en una tabla. Incluso cuando inserto solo la primera clob obtengo ORA-00911: invalid character
. No puedo encontrar la forma de extraer la declaración del PreparedStatement
antes de que se ejecute, por lo que no puedo estar 100% seguro de que sea correcto, pero si lo hice bien, debería verse exactamente así:Dónde está mi carácter no válido (ORA-00911)
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;
En última instancia, esta declaración insert all
tendría un montón de into
, por lo que simplemente no hago una declaración insert
regular. No veo un personaje inválido allí, ¿verdad? (Ah, y el código anterior funciona bien cuando lo ejecuto en mi herramienta de desarrollador sql.) Y si elimino el punto y coma en el PreparedStatement
, arroja un error ORA-00933: SQL command not properly ended
.
En cualquier caso, aquí está mi código para ejecutar la consulta (y los valores de las variables para el ejemplo anterior).
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;
}
¿Hay algo que me esté perdiendo a lo grande?
¿Puedes ver PreparedStatement como una cadena para ver lo que contiene? –
Mencioné eso en la publicación. No puedo entender cómo hacer eso. Todo lo que veo en Internet es que es bastante complicado por alguna razón ... – kentcdodds
Algunos controladores JDBC permiten que toString() muestre la consulta de un PreparedStatement y otros no. No estoy seguro acerca de Oracle. –