I'm using com.oracle.database.jdbc:ojdbc11:23.6.0.24.10
against Oracle 23ai 23.4.0.24.05 from here: https://hub.docker.com/r/gvenzl/oracle-free
This produces an error:
try (PreparedStatement s = connection.prepareStatement(
"""
SELECT ?
UNION ALL
SELECT N'Ö'
"""
)) {
s.setNull(1, Types.NVARCHAR);
try (ResultSet rs = s.executeQuery()) {
while (rs.next())
System.out.println(rs.getNString(1));
}
}
The error being:
https://docs.oracle.com/error-help/db/ora-12704/
at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:712)
at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:612)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1364)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:969)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:237)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:516)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:275)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:1232)
at oracle.jdbc.driver.OracleStatement.prepareDefineBufferAndExecute(OracleStatement.java:1413)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1287)
at oracle.jdbc.driver.OracleStatement.executeSQLSelect(OracleStatement.java:1844)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1620)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3961)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:4148)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1117)
at org.jooq.testscripts.JDBC.main(JDBC.java:47)
Caused by: Error : 12704, Position : 8, SQL = SELECT :1 UNION ALL
SELECT u'\00d6'
, Original SQL = SELECT ?
UNION ALL
SELECT N'Ö'
, Error Message = ORA-12704: character set mismatch
at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:720)
... 15 more
I don't see why this should be a problem, since this works correctly:
try (PreparedStatement s = connection.prepareStatement(
"""
SELECT ?
UNION ALL
SELECT N'Ö'
"""
)) {
s.setNString(1, null);
try (ResultSet rs = s.executeQuery()) {
while (rs.next())
System.out.println(rs.getNString(1));
}
}
Printing the expected output:
null
Ö
I'd consider this a bug in ojdbc