【问题标题】:AbstractMethodError thrown when creating a Clob object in Java oracle procedure在 Java oracle 过程中创建 Clob 对象时抛出 AbstractMethodError
【发布时间】:2018-03-11 05:14:48
【问题描述】:

我正在开发一个必须实例化 CLOB 对象的 Java PLSQL 过程。为了实例化该 Clob 对象,我必须使用连接对象。基于Oracle documentation,我可以使用 java.sql.DriverManager 获取当前连接,但是当我执行以下代码时,会抛出 AbstractMethodError 错误

Connection conn = DriverManager.getConnection("jdbc:default:connection:");
Clob clob = conn.createClob();

我看到很多帖子都在讨论驱动程序与运行代码的 Java 运行时的兼容性,但是当我在 Oracle DB 中工作时,我想它应该是兼容的。

Oracle 版本:11.2.0.4.0

我的目标是在我的 java 方法中创建一个 clob 并将它返回给我的 plsql 代码。如何在存储在 Oracle 数据库中的 java 类中实例化 Clob?

感谢您的帮助!

【问题讨论】:

    标签: java oracle plsql


    【解决方案1】:

    CLOBusing conn.createClob() 的创建适用于我在 12c 中的表现。我怀疑您在 11 中的错误消息必须使用 CLOB.createTemporary 方法来创建 CLOB(在 12c 中也可以正常工作,但被标记为已弃用)。

    这里是一个例子

    Java 类

    CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "CreateCLOB"
    AS 
    import java.sql.*;
    import oracle.sql.*;
    import oracle.jdbc.*;
    
    /****** START PASTE JAVA CLASS HERE *****/
    public class CreateCLOB{
    
      public static void ClobProc (Clob cl[]) throws SQLException
      {
        Connection conn = DriverManager.getConnection ("jdbc:default:connection:"); /* or use "jdbc:oracle:kprb:" */
    
        Clob clob =  CLOB.createTemporary(conn, false, oracle.sql.CLOB.DURATION_SESSION); /* this is deprecated in 12c */
                    // conn.createClob(); /* works fine in 12.1.0.2.0 */
        clob.setString(1, "Test Data");
        cl[0] = clob;
      }
    }
    /
    

    包装器

    create or replace procedure MyClob (cl OUT Clob) 
      as language java
      name 'CreateCLOB.ClobProc(java.sql.Clob[])';
    /
    

    测试

    declare
    x Clob;
    
    begin
      MyClob(x);
      dbms_output.put_line('created CLOB length = ' || dbms_lob.getlength(x));
    end;
    /
    
    created CLOB length = 9
    

    如前所述,我无法在版本 11 上对其进行测试,但我想它会起作用。

    select * from v$version;
    Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
    

    【讨论】:

    • 我确认它在 Oracle 11.2 上可以正常工作!谢谢 ;-) 你有任何文件解释为什么我们必须使用 CLOB.createTemporary 吗?
    • createClob 在接口 java.sql.Connection 中定义。 11g 中的接口 oracle.jdbc.OracleConnection 不继承它。它是从12c 开始实现的——这解释了 11g 中的 abstractMethod 异常。
    【解决方案2】:

    您需要按照以下步骤操作:

    1.在您的计算机上,您应该有一个 Oracle jdbc 驱动程序 (http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html)

    2。加载驱动程序

    Class.forName("oracle.jdbc.driver.OracleDriver");
    

    3.获取连接

    Connection connection =
    DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:SID","username","password");
    

    更新:如果您在 Oracle DB 内部工作,您可以选择一种驱动程序(服务器端精简驱动程序或服务器端内部驱动程序)-https://docs.oracle.com/cd/E11882_01/appdev.112/e13995/oracle/jdbc/OracleDriver.html

    【讨论】:

    • 正如我所解释的,我不在计算机上,而是在 Oracle 数据库中。我的代码将作为 Oracle Java 过程执行,如docs.oracle.com/cd/B19306_01/java.102/b14187/chfive.htm 中所述
    • 我更新了我的答案,您尝试使用这些类型的驱动程序吗?
    • 我试过...如果我能逐点回答你: 1. 是的,我有一个 Oracle jdbc 驱动程序,因为我直接在数据库中。 2. 我试过加载和不加载驱动程序。我想 Oracle 会自动为我们加载这个。 3. 我得到了与DriverManager.getConnection("jdbc:default:connection:"); 的连接,这就是oracle 文档解释我们可以获得与过程调用相关的当前连接的方式。我认为这个问题更多是我的 Oracle 服务器的配置而不是 java 代码问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    相关资源
    最近更新 更多