【问题标题】:How to call an Oracle procedure from Java callablestatement with typed params?如何使用类型参数从 Java callablestatement 调用 Oracle 过程?
【发布时间】:2013-02-14 08:33:14
【问题描述】:

我必须从带有 JDBC Oracle 驱动程序的 Java 应用程序调用 Oracle DB 中的存储过程,其中一些参数是简单类型(VARCHAR2、NUMBER、...),而其他参数是对象或对象的事件表。

create or replace 
type t_TYPE as object (In_PARAM VARCHAR2(255)   );

create or replace 
type t_TYPE_array is table of t_TYPE ;

PROCEDURE SOME_PROC (in_myParam IN t_TYPE_array, out_retVal OUT NUMBER) AS ...

我使用的是 Java 1.6 和 ojdbc6,我的方式是使用 java.sql.CallableStatement,但我对其他解决方案持开放态度(在 JDBC 驱动程序之上)。

附:它是在 Jboss 5 中运行的企业应用程序(来自数据源的连接)。

谢谢

【问题讨论】:

    标签: java oracle object jdbc procedure


    【解决方案1】:

    找到自己:

    StructDescriptor structDesc = StructDescriptor.createDescriptor(TYPE_STRUCT, dbConnection);
    ArrayDescriptor arrayDesc = ArrayDescriptor.createDescriptor(TYPE_ARRAY, dbConnection);
    
    Object[] objType = new Object[1];
    objType[0] = new String("param data");
    oracle.sql.STRUCT struct = new oracle.sql.STRUCT(structDesc, dbConnection, objType);
    
    Object[] arrayObj = new Object[size];
    arrayObj[0] = struct;
    arrayObj[1] = struct1;
    [...]
    oracle.sql.ARRAY array = new oracle.sql.ARRAY(arrayDesc, dbConnection, arrayObj);
    
    callableStatement = dbConnection.prepareCall(MY_CALL);
    [...]
    callableStatement.setArray(4, array);
    

    【讨论】:

      【解决方案2】:

      对于一些接受 VARCHAR 和数字作为输入和数字输出的存储过程,我会这样做。

          Connection conn = null;
          CallableStatement cs = null;
          try {
              conn = dataSource.getConnection();
              cs = conn.prepareCall("{ CALL pkg.someproc(?,?,?) }");
      
              //populate stored proc parameters
              cs.setString(1, param1);
              cs.setInt(2, param2);
              cs.registerOutParameter(3, Types.NUMERIC); 
      
              //execute stored procedure
              cs.execute();
          }
      

      【讨论】:

      • 感谢您的回复,这是一个带有原生类型参数的简单调用...我的问题是关于复杂类型参数 :(
      • 当然,我们在谈论什么样的参数? :) 如果需要数组,可以使用 oracle.sql.ARRAY,然后使用 cs.setArray
      • 嗯,你可以在问题正文中找到参数定义! :)
      猜你喜欢
      • 2019-06-18
      • 1970-01-01
      • 2013-12-04
      • 2013-01-11
      • 2021-06-28
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多