Skip to Main Content

Database Software

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

How to select specific element from a XML document using JDBC?

760318May 11 2010 — edited May 12 2010
Hi all,

I have a problem with selecting specific XML element in Oracle 11g release 1 from my java application. Data are stored in object-relational storage.

My file looks like:
<students>
<student id="1">
...
</student>
<student id="2">
...
</student>
<student id="3">
...
</student>
...
</students>

I need to select a specific <student> element. I've already tried few ways to achieve my goal but I failed.

SELECT extract(OBJECT_VALUE,'/students/student') FROM students - works fine, but this selects all <student> elements

SELECT extract(OBJECT_VALUE,'/students/student[1FROM students - which should select first <student> element works too but it causes exception when using JDBC driver returns:
java.sql.SQLException: Only LOB or String Storage is supported in Thin XMLType
at oracle.xdb.XMLType.processThin(XMLType.java:2817)
at oracle.xdb.XMLType.<init>(XMLType.java:1238)
at oracle.xdb.XMLType.createXML(XMLType.java:698)
at oracle.xdb.XMLType.createXML(XMLType.java:676)
at cz.zcu.hruby.data.Select.getStudent(Select.java:45)

SELECT to_clob(extract(OBJECT_VALUE,'/students/student[1]')) FROM students - in this case I hoped that DB would convert result to CLOB but the element is quite large (definitely more than 4000 Bytes long which I find out from forum is limit). But this exception occurs:
java.sql.SQLException: ORA-19011: Character string buffer too small
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:206)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:1034)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:194)
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:953)
at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:897)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1186)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3387)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3431)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491)
at cz.zcu.hruby.data.Select.getStudent(Select.java:40)

SELECT to_lob(extract(OBJECT_VALUE,'/students/student[1]')) FROM students - I hoped I can convert return value to a LOB value but that doesn't work for me either:
java.sql.SQLSyntaxErrorException: ORA-00932: inconsistent datatypes: expected -, got -
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:91)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:206)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:1034)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:194)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:791)
at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:866)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1186)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3387)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3431)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491)
at cz.zcu.hruby.data.Select.getStudent(Select.java:40)

This behaviour raises two questions:

1) Why SELECT extract(OBJECT_VALUE,'/students/student') FROM students works but SELECT extract(OBJECT_VALUE,'/students/student[1FROM students does't ?
2) Is there any way how I can select specific element (element XPath /students/student[@id="some value"]) and convert it to String?

Thanks for your responses I would appreciate any suggestion

Honza
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Jun 9 2010
Added on May 11 2010
7 comments
4,610 views