ฉันกำลังพยายามสร้าง clob จากสตริง> 4,000 chars (จัดทำในตัวแปรผูก file_data) เพื่อใช้ในเพรดิเคต Oracle SELECT ด้านล่าง:
myQuery=
select *
from dcr_mols
WHERE flexmatch(ctab,:file_data,'MATCH=ALL')=1;
ถ้าฉันเพิ่ม TO_CLOB () round file_data มันจะไม่ จำกัด Oracle 4k ที่น่าอับอายสำหรับ varchar (ใช้ได้กับสตริง <4k) ข้อผิดพลาด (ใน SQL Developer) คือ:
ORA-01460: unimplemented or unreasonable conversion requested
01460. 00000 - "unimplemented or unreasonable conversion requested"
FYI ฟังก์ชัน flexmatch ใช้สำหรับค้นหาโมเลกุลและอธิบายไว้ที่นี่: http://help.accelrysonline.com/ulm/onelab/1.0/content/ulm_pdfs/direct/developers/direct_2016_developersguide.pdf
ฟังก์ชั่นนั้นค่อนข้างซับซ้อน แต่สาระสำคัญคือพารามิเตอร์ที่ 2 จะต้องมีการปิดบัง ดังนั้นคำถามของฉันคือฉันจะแปลง Java String bind_variable ของ 4000 chars เป็น clob ใน sql (หรือ Java) ได้อย่างไร
ฉันลองวิธีด้านล่าง (ซึ่งใช้งานได้เมื่อใส่ clobs) ใน Java (Spring boot 2) โดยใช้:
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("file_data", fileDataStr,Types.CLOB);
jdbcNamedParameterTemplate.query(myQuery,parameters,…
วิธีนี้ควรใช้งานได้ แต่ล้มเหลวโดยมีข้อผิดพลาด flexmatch ที่มาบรรจบกันซึ่ง 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"
หมายเหตุฉันใช้ SpringBoot 2 แต่ฉันไม่สามารถรับวิธีการใด ๆ โดยใช้ OracleConnection (ได้รับจากวัตถุ Spring 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}
โปรดทราบว่ามันใช้งานได้ดีถ้าฉันไปโรงเรียนเก่าและใช้การเชื่อมต่อที่ไม่ใช่สปริงบวกกับ PreparedStatement ซึ่งมีเมธอด 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();
แต่ฉันต้องการโซลูชัน Spring 2 ใน Java หรือ SQL ความช่วยเหลือข้อเสนอแนะชื่นชม
flexmatch()
ฟังก์ชั่นได้หรือไม่? ฉันต้องการเห็นความจำเป็นสำหรับสิ่งนี้ สุจริตฉันไม่เคยใช้ค่าขนาดใหญ่เป็นพารามิเตอร์ในWHERE
ข้อ ฉันใช้มันINSERT
แล้วฉันก็ใช้มันกลับคืนSELECT
มา กรณีของคุณแตกต่าง