Sto cercando di creare un clob da una stringa di> 4000 caratteri (forniti nella variabile bind file_data) da utilizzare in un predicato Oracle SELECT di seguito:
myQuery=
select *
from dcr_mols
WHERE flexmatch(ctab,:file_data,'MATCH=ALL')=1;
Se aggiungo TO_CLOB () intorno a file_data fallisce il famigerato limite di Oracle 4k per un varchar (va bene per <4k stringhe). L'errore (in SQL Developer) è:
ORA-01460: unimplemented or unreasonable conversion requested
01460. 00000 - "unimplemented or unreasonable conversion requested"
Cordiali saluti La funzione flexmatch viene utilizzata per la ricerca di molecole ed è descritta qui: http://help.accelrysonline.com/ulm/onelab/1.0/content/ulm_pdfs/direct/developers/direct_2016_developersguide.pdf
La stessa funzione è un po 'complicata, ma l'essenza è che il secondo parametro deve essere un clob. Quindi la mia domanda è come posso convertire una stringa Java bind_variable di oltre 4000 caratteri in un clob in sql (o Java).
Ho provato il metodo seguente (che funziona quando si inseriscono clobs) in Java (Spring boot 2) utilizzando:
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("file_data", fileDataStr,Types.CLOB);
jdbcNamedParameterTemplate.query(myQuery,parameters,…
Questo metodo dovrebbe funzionare ma fallisce con un errore di flexmatch converto che FYI è:
SQL state [99999]; error code [29902]; ORA-29902: error in executing ODCIIndexStart() routine\nORA-20100:
MDL-0203: Unable to read from CLOB (csfrm=1, csid=873):
ORA-22922: nonexistent LOB value\nMDL-0021: Unable to copy LOB to string\nMDL-1051: Molstructure search query is not a valid molecule\nMDL-0976:
Molecule index search initialization failed\nORA-06512: at \"C$MDLICHEM80.MDL_MXIXMDL\", line 329\nORA-06512: at \"C$MDLICHEM80.MDL_MXIXMDL\", line 309\n; nested exception is java.sql.SQLException:
ORA-29902: error in executing ODCIIndexStart() routine\nORA-20100: MDL-0203: Unable to read from CLOB (csfrm=1, csid=873):
ORA-22922: nonexistent LOB value\nMDL-0021: Unable to copy LOB to string\nMDL-1051: Molstructure search query is not a valid molecule\nMDL-0976:
Molecule index search initialization failed\nORA-06512: at \"C$MDLICHEM80.MDL_MXIXMDL\", line 329\nORA-06512: at \"C$MDLICHEM80.MDL_MXIXMDL\", line 309\n"
Nota che sto usando SpringBoot 2 ma non riesco a ottenere alcun metodo utilizzando un OracleConnection (ottenuto dal mio oggetto Spring NamedParametersJdbcTemplate) per funzionare (anche su clobs <4k), quindi sospetto di aver fatto qualcosa di stupido. Ho provato:
@Autowired
NamedParameterJdbcTemplate jdbcNamedParameterTemplate;
OracleConnection conn = this.jdbcNamedParameterTemplate.getJdbcTemplate().getDataSource().getConnection().unwrap(OracleConnection.class);
Clob myClob = conn.createClob();
myClob.setString( 1, fileDataStr);
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("file_data", myClob,Types.CLOB);
application.properties:
spring.datasource.url=jdbc:oracle:thin:@//${ORA_HOST}:${ORA_PORT}/${ORA_SID}
spring.datasource.username=${ORA_USER}
spring.datasource.password=${ORA_PASS}
Nota che funziona bene se vado alla vecchia scuola e utilizzo una connessione non a molla più un PreparedStatement, che ha un metodo setClob ():
OracleDataSource ods = new OracleDataSource();
String url ="jdbc:oracle:thin:@//" + ORA_HOST +":"+ORA_PORT +"/"+ORA_SID;
ods.setURL(url);
ods.setUser(user);
ods.setPassword(passwd);
Connection conn = ods.getConnection();
Clob myClob=conn.createClob();
PreparedStatement ps = conn.prepareStatement("select dcr_number from dcr_mols WHERE flexmatch(ctab,?,'MATCH=ALL')=1");
myClob.setString(1,myMol);
ps.setClob(1,myClob);
ResultSet rs =ps.executeQuery();
Preferirei una soluzione Spring 2 in Java o Sql. Qualsiasi aiuto, suggerimenti apprezzati.
flexmatch()funzione? Mi piacerebbe vedere la necessità di questo. Onestamente, non ho mai usato grandi valori come parametri nellaWHEREclausola. Li ho usatiINSERTe li ho recuperati usandoSELECT. Il tuo caso è diverso.