【问题标题】:Can we integrate Oracle RECORD TYPE with java Callable statement?我们可以将 Oracle RECORD TYPE 与 java Callable 语句集成吗?
【发布时间】:2013-06-27 09:30:25
【问题描述】:

RECORD类型与JDBC不兼容是真的吗?正在使用的驱动程序是 OJDBC6.jar

Java 代码:

dbStrategy.openConnection();
        WrappedConnectionJDK6 wrapped = (WrappedConnectionJDK6) dbStrategy.getConnection();
        OracleConnection oracleConnection = (OracleConnection) wrapped.getUnderlyingConnection();
        CallableStatement callableStatement = oracleConnection.prepareCall("{call XXX_Info_Utl_Pkg.get_order_admin(?,?,?,?,?)}");
        callableStatement.setInt(1, Integer.parseInt(orderNumber));
        callableStatement.registerOutParameter(2, OracleTypes.ARRAY, "XXX_INFO_UTL_PKG.SEAGRS_ORDER_REC");
        callableStatement.registerOutParameter(3, OracleTypes.NUMBER);
        callableStatement.registerOutParameter(4, OracleTypes.VARCHAR);
        callableStatement.registerOutParameter(5, OracleTypes.NUMBER);

还有 Oracle 代码:

PROCEDURE get_order_admin(
            p_order_num_in IN NUMBER,
            p_order_admin_out OUT XXX_info_utl_pkg.seagrs_order_rec,
            p_error_code_out OUT PLS_INTEGER,
            p_error_msg_out OUT VARCHAR2,
            p_ret_status_out OUT PLS_INTEGER);


TYPE seagrs_order_rec
IS
    record
    (
        order_admin        VARCHAR2(10),
        contact_name       VARCHAR2(50),
        contact_email_addr VARCHAR2(100),
        contact_phone_num  VARCHAR2(30));

这里面临的错误是 -

例外:无效的名称模式:XXX_INFO_UTL_PKG.SEAGRS_ORDER_REC

【问题讨论】:

  • 你能发布完整的错误堆栈吗?
  • 14:53:47,546 错误 [com.commands.RecRetOrderAdminInfoCmd] (http-/0.0.0.0:8080-1) 发生异常 ::方法名称:执行,异常:无效名称模式:XXX_INFO_UTL_PKG。 XXX_ORDER_REC 14:53:47,562 错误 [com.daos.ReceivingServiceDAO] (http-/0.0.0.0:8080-1) 发生异常:ReceivingServiceDAO,方法名称:getOrderAdminInfo
  • 您的seagrs_order_rec 属于什么typeArray or Object or table?
  • TYPE seagrs_order_rec IS 记录类型

标签: java oracle jdbc


【解决方案1】:

记录类型与 JDBC 驱动程序不兼容:

Oracle JDBC驱动不支持调用 PL/SQL RECORD、BOOLEAN 或表的参数或返回值 具有非标量元素类型。但是,Oracle JDBC 驱动程序支持 标量元素类型的 PL/SQL 索引表。

READ THIS

【讨论】:

    【解决方案2】:

    虽然您不能直接使用 JDBC 来获取您的 PL/SQL RECORD 类型,但您可以编写一个匿名 PL/SQL 块并将记录返回到一个局部变量中,然后您可以将其分解为各个属性,如下所示:

    DECLARE
        rec XXX_info_utl_pkg.seagrs_order_rec;
    BEGIN
        get_order_admin(?, rec, ?, ?, ?);
        ? := rec.order_admin;
        ? := rec.contact_name;
        ? := rec.contact_email_addr;
        ? := rec.contact_phone_num;
    END;
    

    您现在可以使用以下 JDBC 代码调用该过程:

    try (CallableStatement s = con.prepareCall(" ... previous PL/SQL block ...")) {
        s.setInt(1, Integer.parseInt(orderNumber));
    
        // Ordinary out parameters
        s.registerOutParameter(2, Types.NUMBER);
        s.registerOutParameter(3, Types.VARCHAR);
        s.registerOutParameter(4, Types.NUMBER);
    
        // Out parameters from your decomposed record
        s.registerOutParameter(5, Types.VARCHAR);
        s.registerOutParameter(6, Types.VARCHAR);
        s.registerOutParameter(7, Types.VARCHAR);
        s.registerOutParameter(8, Types.VARCHAR);
    
        s.execute();
        // Now, retrieve all the out parameters
    }
    

    I have recently blogged about this technique more in detail。该博客文章还包含有关如何为所有具有记录 IN/OUT 参数的函数/过程自动生成匿名 PL/SQL 块的说明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多