मैं नीचे दिए गए Oracle चयन में प्रयोग किए जाने के लिए> 4000 वर्णों (file_data बाँध चर में आपूर्ति) की एक स्ट्रिंग से एक क्लोब बनाने की कोशिश कर रहा हूँ:
myQuery=
select *
from dcr_mols
WHERE flexmatch(ctab,:file_data,'MATCH=ALL')=1;
अगर मैं TO_CLOB () राउंड file_data जोड़ता हूं तो यह एक varchar के लिए बदनाम Oracle 4k सीमा को विफल करता है (यह <4k स्ट्रिंग्स के लिए ठीक है)। त्रुटि (SQL डेवलपर में) है:
ORA-01460: unimplemented or unreasonable conversion requested
01460. 00000 - "unimplemented or unreasonable conversion requested"
FYI करें फ्लेक्समैच फ़ंक्शन का उपयोग अणुओं की खोज के लिए किया जाता है, और यहाँ वर्णित है: http://help.accelrysonline.com/ulm/onelab/1.0/content/ulm_pdfs/direct/developers/direct/2016_developersguide.pdf
फ़ंक्शन स्वयं थोड़ा जटिल है, लेकिन सार यह है कि 2 पैरामीटर एक क्लोब होना है। तो मेरा सवाल यह है कि मैं एक जावा स्ट्रिंग bind_variable 4000 से अधिक वर्णों को sql (या जावा) में एक क्लोब में कैसे परिवर्तित करूं।
मैंने जावा (स्प्रिंग बूट 2) का उपयोग करते हुए नीचे की विधि (जो कि क्लोब्स डालने पर काम करता है) की कोशिश की:
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("file_data", fileDataStr,Types.CLOB);
jdbcNamedParameterTemplate.query(myQuery,parameters,…
यह तरीका काम करना चाहिए लेकिन यह एक परिवर्तित फ्लेक्समैच त्रुटि के साथ विफल हो जाता है जो 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"
ध्यान दें कि मैं स्प्रिंगबूट 2 का उपयोग कर रहा हूं, लेकिन मैं OracleConnection (मेरे स्प्रिंग NamedParametersJdbcTemplate ऑब्जेक्ट से प्राप्त) का उपयोग करके किसी भी विधि को प्राप्त नहीं कर सकता (यहां तक कि लौंग <4k पर), इसलिए मुझे संदेह है कि मैंने कुछ बेवकूफ किया है। मैंने कोशिश की:
@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);
आवेदन:
spring.datasource.url=jdbc:oracle:thin:@//${ORA_HOST}:${ORA_PORT}/${ORA_SID}
spring.datasource.username=${ORA_USER}
spring.datasource.password=${ORA_PASS}
ध्यान दें कि यह ठीक काम करता है अगर मैं पुराने स्कूल में जाता हूं और एक गैर वसंत कनेक्शन के साथ-साथ एक रेडीस्टेटमेंट का उपयोग करता हूं, जिसमें एक सेट क्लोब () विधि है:
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();
लेकिन मैं जावा या एसक्यूएल में एक स्प्रिंग 2 समाधान पसंद करूंगा। कोई मदद, सुझाव की सराहना की
flexmatch()
फ़ंक्शन के लिए एपीआई डॉक्स को इंगित कर सकते हैं ? मैं इसकी आवश्यकता देखना चाहूंगा। ईमानदार, मैंनेWHERE
खंड में बड़े मानों को मापदंडों के रूप में कभी इस्तेमाल नहीं किया । मैंनेINSERT
उनका उपयोग किया है, मैंने उनका उपयोग करके पुनः प्राप्त किया हैSELECT
। आपका मामला अलग है।