Tôi đang cố gắng tạo một clob từ một chuỗi> 4000 ký tự (được cung cấp trong biến liên kết file_data) để được sử dụng trong một vị từ Oracle SELECT bên dưới:
myQuery=
select *
from dcr_mols
WHERE flexmatch(ctab,:file_data,'MATCH=ALL')=1;
Nếu tôi thêm tập tin tròn TO_CLOB (), nó sẽ thất bại giới hạn 4k của Oracle khét tiếng đối với một varchar (sẽ tốt cho các chuỗi <4k). Lỗi (trong SQL Developer) là:
ORA-01460: unimplemented or unreasonable conversion requested
01460. 00000 - "unimplemented or unreasonable conversion requested"
FYI Hàm flexmatch được sử dụng để tìm kiếm các phân tử và được mô tả ở đây: http://help.accelrysonline.com/ulm/onelab/1.0/content/ulm_pdfs/direct/developers/direct_2016_developersguide.pdf
Bản thân hàm này hơi phức tạp nhưng thực chất là tham số thứ 2 phải là một nút. Vì vậy, câu hỏi của tôi là làm cách nào để chuyển đổi một chuỗi Java bind_variable gồm hơn 4000 ký tự thành một ký tự theo sql (hoặc Java).
Tôi đã thử phương thức bên dưới (hoạt động khi chèn clobs) trong Java (Spring boot 2) bằng cách sử dụng:
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("file_data", fileDataStr,Types.CLOB);
jdbcNamedParameterTemplate.query(myQuery,parameters,…
Phương pháp này sẽ hoạt động nhưng không thành công với lỗi flexmatch hội tụ mà FYI là:
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"
Lưu ý rằng tôi đang sử dụng SpringBoot 2 nhưng tôi không thể sử dụng bất kỳ phương thức nào bằng cách sử dụng OracleConnection (thu được từ đối tượng Spring NamedParameterJdbcTemplate của tôi) để hoạt động (ngay cả trên clobs <4k), vì vậy tôi nghi ngờ mình đã làm điều gì đó ngu ngốc. Tôi đã thử:
@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);
ứng dụng. sản phẩm:
spring.datasource.url=jdbc:oracle:thin:@//${ORA_HOST}:${ORA_PORT}/${ORA_SID}
spring.datasource.username=${ORA_USER}
spring.datasource.password=${ORA_PASS}
Lưu ý rằng nó hoạt động tốt nếu tôi đi học cũ và sử dụng kết nối không phải là lò xo cộng với PreparedStatement, có phương thức 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();
Nhưng tôi thích giải pháp Spring 2 hơn trong Java hoặc Sql. Bất kỳ trợ giúp, đề nghị đánh giá cao.
flexmatch()
hàm không? Tôi muốn thấy sự cần thiết cho việc này. Thành thật mà nói, tôi không bao giờ sử dụng các giá trị lớn làm tham số trongWHERE
mệnh đề. Tôi đã sử dụng chúng trongINSERT
và, tôi đã lấy chúng bằng cách sử dụngSELECT
. Trường hợp của bạn là khác nhau.