Как вызвать процедуру Oracle из callablestatement Java с типизированными параметрами?

Мне нужно вызвать из приложения Java с драйвером JDBC Oracle хранимую процедуру в базе данных Oracle, в которой некоторые параметры являются простыми типами (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).

P.S. Это корпоративное приложение, работающее в Jboss 5 (подключение из источника данных).

Спасибо


person Mito    schedule 28.02.2013    source источник


Ответы (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);
person Mito    schedule 04.03.2013

Я бы сделал что-то подобное для некоторого хранимого процесса, который принимает 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();
    }
person Ian    schedule 28.02.2013
comment
Спасибо за ответ, это простой вызов с параметрами собственного типа... Моя проблема связана с параметрами сложного типа :( - person Mito; 28.02.2013
comment
конечно, о каких параметрах мы говорим? :) Если вам нужны массивы, вы можете использовать oracle.sql.ARRAY, затем cs.setArray - person Ian; 28.02.2013
comment
Хм, вы можете найти определение параметров в теле вопроса! :) - person Mito; 28.02.2013