아래의 Oracle SELECT 술어에 사용하기 위해> 4000 문자 (file_data 바인드 변수에 제공)의 문자열에서 clob를 작성하려고합니다.
myQuery=
select *
from dcr_mols
WHERE flexmatch(ctab,:file_data,'MATCH=ALL')=1;
TO_CLOB () 라운드 file_data를 추가하면 varchar에 대한 악명 높은 Oracle 4k 제한에 실패합니다 (4k 미만의 문자열에는 적합합니다). 오류 (SQL Developer의 경우)는 다음과 같습니다.
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
함수 자체는 약간 복잡하지만 본질은 두 번째 매개 변수는 clob이어야합니다. 그래서 내 질문은 4000 자 이상의 Java String bind_variable을 sql (또는 Java)의 clob로 어떻게 변환합니까?
Java (Spring boot 2)에서 아래 방법을 사용하여 clob를 삽입 할 때 작동합니다.
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("file_data", fileDataStr,Types.CLOB);
jdbcNamedParameterTemplate.query(myQuery,parameters,…
이 방법은 작동하지만 FYI 인 수렴 된 flexmatch 오류와 함께 실패합니다.
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를 사용하고 있지만 Oracle Connection (Spring NamedParametersJdbcTemplate 객체에서 얻은)을 사용하여 (4 clob <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);
application.properties :
spring.datasource.url=jdbc:oracle:thin:@//${ORA_HOST}:${ORA_PORT}/${ORA_SID}
spring.datasource.username=${ORA_USER}
spring.datasource.password=${ORA_PASS}
오래된 학교에 가서 비 스프링 연결과 setClob () 메소드가있는 PreparedStatement를 사용하면 잘 작동합니다.
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();
그러나 Java 또는 Sql의 Spring 2 솔루션을 선호합니다. 도움, 제안 부탁드립니다.
flexmatch()
함수에 대한 API 문서를 지적 할 수 있습니까 ? 나는 이것에 대한 필요성을보고 싶다. 솔직히, 나는WHERE
절 에서 큰 값을 매개 변수로 사용하지 않았습니다 . 나는INSERT
그것들을 사용했고를 사용하여 그것들을 검색했다SELECT
. 귀하의 경우는 다릅니다.