আমি নীচে ওরাকল সিলেক্ট প্রিডিকেটটিতে ব্যবহার করতে> 4000 চর (ফাইল_ডাটা বাইন্ড ভেরিয়েবলের সরবরাহ করা) এর স্ট্রিং থেকে একটি ক্লোব তৈরি করার চেষ্টা করছি:
myQuery=
select *
from dcr_mols
WHERE flexmatch(ctab,:file_data,'MATCH=ALL')=1;
যদি আমি TO_CLOB () রাউন্ড ফাইল_ডেটা যোগ করি তবে এটি কোনও ভারচারের জন্য কুখ্যাত ওরাকল 4k সীমা ব্যর্থ করে (এটি <4k স্ট্রিংয়ের জন্য ঠিক আছে)। ত্রুটিটি (এসকিউএল বিকাশকারীতে) হ'ল:
ORA-01460: unimplemented or unreasonable conversion requested
01460. 00000 - "unimplemented or unreasonable conversion requested"
অবগতির জন্য flexmatch ফাংশন অণু অনুসন্ধানের জন্য ব্যবহার করা হয়, এবং একটি এখানে বর্ণিত হয়: http://help.accelrysonline.com/ulm/onelab/1.0/content/ulm_pdfs/direct/developers/direct_2016_developersguide.pdf
ফাংশনটি নিজেই কিছুটা জটিল তবে সংক্ষেপে ২ য় প্যারামিটারটি একটি চুল্লা হতে হবে। সুতরাং আমার প্রশ্নটি হল আমি কীভাবে 4000 এর বেশি অক্ষরের একটি জাভা স্ট্রিং বাইন্ড_ভেরিয়েবলকে স্কোলে (বা জাভা) একটি চকিতে রূপান্তর করব।
আমি জাভাতে (স্প্রিং বুট 2) নীচের পদ্ধতিটি ব্যবহার করেছি (যা ক্লোবগুলি সন্নিবেশ করার সময় কাজ করে):
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("file_data", fileDataStr,Types.CLOB);
jdbcNamedParameterTemplate.query(myQuery,parameters,…
এই পদ্ধতিতে কাজ করা উচিত তবে এটি রূপান্তরিত ফ্লেক্সমেচ ত্রুটিতে যা ব্যর্থ হয় যা এফওয়াইআই:
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 ব্যবহার করছি তবে আমি কাজ করতে (এমনকি আমার ক্লিপ <4 কে তেও) আমার ওরক্লিং নেমডপ্যারামিটারজেডবিসিটেম্পলেট অবজেক্ট থেকে প্রাপ্ত) কোনও ওরাকল সংযোগ ব্যবহার করে কোনও পদ্ধতি পেতে পারি না, তাই আমার সন্দেহ হয় যে আমি বোকা কিছু করেছি। আমি চেষ্টা করেছিলাম:
@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()
ফাংশনটির জন্য API ডক্সটি নির্দেশ করতে পারেন ? আমি এটির প্রয়োজনটি দেখতে চাই। সত্য, আমি কখনও ক্লজটিতে প্যারামিটার হিসাবে বড় মান ব্যবহার করি নিWHERE
। আমি এগুলিতে ব্যবহার করেছিINSERT
এবং, আমি তাদের ব্যবহার করে পুনরুদ্ধার করেছিSELECT
। আপনার কেস আলাদা।