簡體   English   中英

Oracle 19c jdbc 驅動程序不支持大於 30 字節的模式名稱

[英]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

從您的文檔鏈接

除非另有說明,以下規則列表適用於帶引號和不帶引號的標識符:

  1. 標識符名稱的最大長度取決於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM