Java应用连接Oracle8 Release 8.0.5.0.0遇ORA-02248报错求助
连接Oracle 8.0.5时的ORA-02248错误排查
问题场景
需要通过Java应用连接Oracle8 Release 8.0.5.0.0,编写的代码如下:
import java.sql.*; class OracleConOldJava { public static void main(String args[]) { Connection con = null; Statement stmt = null; ResultSet rs = null; try { // Load the Oracle JDBC driver Class.forName("oracle.jdbc.driver.OracleDriver"); // Establish the database connection con = DriverManager.getConnection( "jdbc:oracle:thin:@192.168.1.3:1521/DBNAME", "USERNAME", "PASSWORD"); // Create a statement stmt = con.createStatement(); // Execute the SQL query with FETCH FIRST to limit the number of rows rs = stmt.executeQuery( "SELECT COL1, COL2, COL3 FROM TABLE_A FETCH FIRST 5 ROWS ONLY"); // Iterate through the result set and print the data while (rs.next()) { System.out.println( rs.getInt("COL") + " " + rs.getString("COL2") + " " + rs.getString("COL3")); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { try { // Close the resources in the reverse order of acquisition if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (con != null) con.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
使用Java 1.4搭配ojdbc14.jar,或Java 1.8搭配ojdbc8.jar运行时,均出现以下错误:
C:\j2sdk1.4.2_18\bin\java.exe -cp .;ojdbc14.jar OracleConOldJava java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1 ORA-02248: invalid option for ALTER SESSION at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:283) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:278) at oracle.jdbc.driver.T4CTTIoauthenticate.receiveOauth(T4CTTIoauthenticate.java:785) at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:362) at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:414) at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165) at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35) at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801) at java.sql.DriverManager.getConnection(DriverManager.java:512) at java.sql.DriverManager.getConnection(DriverManager.java:171) at OracleConOldJava.main(OracleConOldJava.java:14)
错误原因及解决方案
1. 核心原因:驱动版本不兼容
你使用的ojdbc14.jar、ojdbc8.jar都是为Oracle 10g及以后版本开发的高版本驱动,这些驱动在建立连接时会自动执行一些Oracle 8.0.5不支持的ALTER SESSION语句(比如设置时区、字符集参数等),而Oracle 8.0.5无法识别这些参数,直接抛出ORA-02248错误。
2. 正确的驱动版本选择
必须使用适配Oracle 8i(8.0.x)的JDBC驱动:
- 若使用Java 1.2/1.3:选择
classes12.jar - 若使用Java 1.4:选择Oracle 8i官方发布的
ojdbc14.jar(注意是对应Oracle 8i版本的驱动,不是后续Oracle版本的同名jar包) - 通用兼容选项:选择
ojdbc1.jar(适配Java 1.1及以上,完全兼容Oracle 8.0.5)
3. 其他需要修正的问题
除了驱动,代码里还有两处Oracle 8.0.5不支持的内容:
- 连接URL格式错误:Oracle 8.0.5的thin驱动仅支持SID格式,需将URL中的斜杠改为冒号:
con = DriverManager.getConnection( "jdbc:oracle:thin:@192.168.1.3:1521:DBNAME", "USERNAME", "PASSWORD"); - SQL语法错误:
FETCH FIRST 5 ROWS ONLY是Oracle 12c引入的语法,Oracle 8.0.5不支持,需改用ROWNUM过滤:rs = stmt.executeQuery( "SELECT COL1, COL2, COL3 FROM (SELECT COL1, COL2, COL3 FROM TABLE_A) WHERE ROWNUM <=5");
内容的提问来源于stack exchange,提问作者Nuwan Madushanka
相关产品推荐
相关产品推荐

