1

我必须从带有 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 驱动程序之上)。

PS 这是一个在 Jboss 5 中运行的企业应用程序(来自数据源的连接)。

谢谢

4

2 回答 2

2

发现自己:

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);
于 2013-03-04T09:57:47.283 回答
0

对于一些接受 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();
    }
于 2013-02-28T08:34:31.407 回答