Fetch PL / SQL array возвращаемые значения в java

в Java как получить значения из pl/sql функция, которая возвращает массив.

если моя функция pl/sql возвращает массив с именем myArray, в java можно получить значения от myArray в объекты java с помощью callablestatement?

спасибо

обновление 1

мой Java-код где я вызываю функцию, но я получаю исключение.

PLS-00306: wrong number or types of arguments in call to 'myfunc'




connection = con.getConnection();
        callablestatement = connection.prepareCall("{call myfunc(?,?,?}");
        callablestatement.setInt(1, param1);
        callablestatement.setInt(2, param2);
        callablestatement.setString(3, param3);
        callablestatement.registerOutParameter(4, Types.ARRAY);
        callablestatement.execute();        
        resultSet = callablestatement.getArray(4).getResultSet();

обновление 2

private final String PRODECURE_NAME = "{? = call myfunc(?,?,?)}";

и

connection = con.getConnection();
    callablestatement = connection.prepareCall(PRODECURE_NAME);
    callablestatement.registerOutParameter(1, Types.ARRAY);
    callablestatement.setInt(2, param1);
    callablestatement.setInt(3, param2);
    callablestatement.setString(4, param3);

    callablestatement.execute();

create or replace type dates
       is varray(100) of varchar2(32);

функции

CREATE OR REPLACE function myfunc (    
    p_id    IN number,
    p_c_id     IN number,
    p_co_no     IN number

)
    RETURN dates
AS
    myarray contract_dates;
    par1        VARCHAR2 (32);
    par2        VARCHAR2 (32);

Исправлено Обновление 3

connection = con.getConnection();
        callablestatement = 
                connection.prepareCall("begin ? :=myfunc(?,?,?); end;");
        callablestatement.registerOutParameter(1, OracleTypes.ARRAY, "DATES");
        callablestatement.setInt(2, param1);
        callablestatement.setInt(3, param2);
        callablestatement.setString(4, param3);
        callablestatement.execute();

5 ответов


Я не делал этого с ARRAY но он должен работать. Сначала вы должны зарегистрироваться out параметр вашей функции. Так что все может быть так.

private final String PRODECURE_NAME = "{? = call <ProcedureName>(?,?,?)}";

Connection con = null;
CallableStatement cs = null;

       try {
            con = DAOFactory.getDatabaseConnection();
            cs = con.prepareCall(PRODECURE_NAME);
            cs.registerOutParameter(1, java.sql.Types.ARRAY);
            cs.setYourType(2, <yourData>);
            cs.setYourType(3, <yourData>);
            cs.setYourType(4, <yourData>);
            cs.execute();
            Array arr = cs.getArray(1);
            if (arr != null) {
               String[] data = (String[]) arr.getArray();
            }
        } 
        catch (SQLException ex) {
            Logger.getLogger(OracleLiekDAO.class.getName()).log(Level.SEVERE, null, ex);
            try {
                con.rollback();
            }
        }
        finally {
            if (con != null) {
                try {
                    con.close();
                } 
                catch (SQLException ex) {
                    Logger.getLogger(OracleLiekDAO.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }

попробуйте этого человека и дайте мне тогда, как это сделать или нет.

EDIT:

эти char ? представляет один параметр, который вы установите (он называется параметризованным). Так вот:

cs.setYourType(2, <yourData>);
cs.setYourType(3, <yourData>);
cs.setYourType(4, <yourData>);

означает, что вы установили свои три параметра (?), первый параметр метод индекса столбца и второй вы данных определенного типа.


EDIT 2:

так жаль, что я написал плохое решение, уже обновлено, поэтому проверьте код сейчас и попробуйте.


myArray, возвращенный из PL / SQL, имеет тип java.язык SQL.Массив. Вы можете вызвать getArray() на нем и введите cast it, чтобы получить массив java.

String[] array = (String[]) myArray.getArray();

да, нужно registerOutParameter типа Types.ARRAY
см. пример здесь


на спецификация JDBC содержится целый раздел (16.5), посвященный работе с массивами. Возможно, вы захотите взглянуть.


Я считаю, что вы можете использовать следующий метод, присутствующий в классе SerialArray, который является прямым потомком java.язык SQL.Массив:

Object getArray(Map<String, Class<?>> map)

здесь карта является держателем объекта и его свойства, которое должно быть сопоставлено с извлеченным набором результатов в возвращаемом массиве.

дополнительные сведения см. В разделе http://docs.oracle.com/javase/1.5.0/docs/api/javax/sql/rowset/serial/SerialArray.html javadoc