[英]Oracle 19c JDBC (Instant client basiclite) driver Issue
[英]Oracle 19c jdbc driver doesn't support schema names bigger than 30 bytes
根據 Oracle 的 19c 文檔:
模式名可以是 128 字節,表名可以是 128 字節,列名可以是 128 字節。
但是,每當我嘗試使用大於 30 個字節的模式名稱時,我都會面臨這個問題:
Caused by: java.sql.SQLException: Invalid argument(s) in call
at oracle.jdbc.driver.PhysicalConnection.setSchema(PhysicalConnection.java:9462)
at com.zaxxer.hikari.pool.ProxyConnection.setSchema(ProxyConnection.java:460)
at com.zaxxer.hikari.pool.HikariProxyConnection.setSchema(HikariProxyConnection.java)
使用的驅動程序是:
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.7.0.0</version>
</dependency>
看起來驅動程序不支持根據 12c 版本引入的更長的對象名稱,是否可以以某種方式配置任何線索? 是否也可能是一些 AWS RDS 特定問題?
在使用相同 jdbc url 的 SQL Developer 上:
SELECT name, value FROM v$parameter WHERE name = 'compatible';
NAME | VALUE
-------------------
compatible | 19.0.0
ALTER SESSION SET CURRENT_SCHEMA = VERY_VERY_VERY_LONG_SCHEMA_NAME;
Session altered.
更新:反編譯驅動程序代碼后,這是我看到的:
public void setSchema(String schema) throws SQLException {
try {
String quoted = "\"[^\u0000\"]{0,28}\"";
String unquoted = "(\\p{javaLowerCase}|\\p{javaUpperCase})(\\p{javaLowerCase}|\\p{javaUpperCase}|\\d|_|\\$|#){0,29}";
String idPat = "(" + quoted + ")|(" + unquoted + ")";
SQLException var10000;
SQLException var9;
if (schema == null) {
var10000 = var9 = (SQLException)((SQLException)DatabaseError.createSqlException(this.getConnectionDuringExceptionHandling(), 68).fillInStackTrace());
throw var10000;
} else if (!schema.matches(idPat)) {
var10000 = var9 = (SQLException)((SQLException)DatabaseError.createSqlException(this.getConnectionDuringExceptionHandling(), 68).fillInStackTrace());
throw var10000;
} else {
String sql = "alter session set current_schema = " + schema;
Statement stmt = null;
try {
stmt = this.createStatement();
stmt.execute(sql);
...
}
這意味着驅動程序被硬編碼為僅接受 30 個字符。 所以這似乎是Oracle JDBC驅動程序實現中的一個錯誤。 任何替代方案的想法?
setSchema
似乎在長標識符更改中被遺忘了(似乎您必須使用 Oracle 打開 SR 才能使其工作)
與JDBC
中長標識符(包括按名稱綁定)的基本用法相反,它似乎工作正常。
例子
def rs = stmt.executeQuery("select COL1, LAAAAAAAAAAAAAAAAAAAAAAAAAAAAARGE_NAME from LAAAAAAAAAAAAAAAAAAAAAAAAAAAAARGE_NAME.LAAAAAAAAAAAAAAAAAAAAAAAAAAAAARGE_NAME")
while(rs.next())
{
println "col1= ${rs.getInt('COL1')} col2= ${rs.getInt('LAAAAAAAAAAAAAAAAAAAAAAAAAAAAARGE_NAME')}"
}
使用 DB 版本 19.3.0.0.0 進行測試
驅動程序版本 19.3.0.0.0 和 21.1.0.0.0
從您的文檔鏈接:
除非另有說明,以下規則列表適用於帶引號和不帶引號的標識符:
標識符名稱的最大長度取決於
COMPATIBLE
初始化參數的值。
如果
COMPATIBLE
設置為 12.2 或更高的值,則名稱長度必須為 1 到 128 個字節,但以下情況除外:
- 數據庫名稱限制為 8 個字節。
- 磁盤組、可插拔數據庫 (PDB)、回滾段、表空間和表空間集的名稱限制為 30 個字節。
如果
COMPATIBLE
設置為低於 12.2 的值,則名稱長度必須為 1 到 30 個字節,但以下情況除外:
- 數據庫名稱限制為 8 個字節。
- 數據庫鏈接的名稱可以長達 128 個字節。
您需要檢查COMPATIBLE
初始化參數,如果它設置在12.2
以下,那么您將被限制為 30 個字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.