Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Вызов pl/sql процедуры из Java


Автор: 0x00 4.8.2011, 10:30
Добрый день!)

Возникла необходимость вызвать процедуру pl/sql (Oracle) из кода Java.
С вызовом процедур, у которых in/out параметры - простые типы - проблем не возникает.

В моем-же случае необходимо вызвать процедуру с собственными типами, примерно так:

Код


procedure fill_sb(vInTable in SB_TABLE, vResult out SB_RESULT_TABLE);

CREATE OR REPLACE TYPE SB_ROW AS OBJECT (
  id number(13),
  the_code varchar2(500)
);

CREATE OR REPLACE TYPE SB_TABLE AS TABLE OF SB_ROW;



вопросов по получению и разбору выходного (out) параметра нету (уже разобрался), возникает вопрос как заполнить и передать массив данных для обработки в процедуру.
делаю примерно так.

Код

                ARRAY vInTable; // вот тут вопрос - "КАК ЗАПОЛНИТЬ?"

                String SQL = "{ call package_name.fill_sb(?, ?)@"+unit.getUnitTns()+" }";
                CallableStatement cs = (CallableStatement)connection.prepareCall(SQL);
                cs.setArray(1, vInTable);
                cs.registerOutParameter(2, OracleTypes.ARRAY, "SB_RESULT_TABLE");


Если есть у когонибудь опыт передачи собственных типов (табличных) в процедуру, прошу помочь словом или куском кода))

Автор: jk1 4.8.2011, 13:04
Вот так мы как-то раз передавали массив строк в хранимку Oracle

Код

    public CallableStatement prepareStatement(Connection conn) throws SQLException {
        ArrayDescriptor arrayDesc = ArrayDescriptor.createDescriptor("DATAROW", conn);
        // собираем нужный нам массив
        ArrayList<byte[]> wrapper = new ArrayList<byte[]>();
        for (String aData : data) {
            wrapper.add(aData.getBytes(Charset.forName("UTF-8")));
        }
        // и, наконец, пакуем все в запрос
        OracleCallableStatement statement = (OracleCallableStatement) conn.prepareCall(
                DBUtilities.getInstance().wrapDBCall("PostRequestDataRow(?,?,?, ?,?)"));
        statement.setInt(1, job.getJobId());
        statement.setDate(2, job.getDate());
        statement.setARRAY(3, new ARRAY(arrayDesc, conn, wrapper.toArray()));
        // игнорируем выходные параметры
        statement.registerOutParameter(4, OracleTypes.INTEGER);
        statement.registerOutParameter(5, OracleTypes.VARCHAR);
        
        return statement;
    }
 
Код

    public String wrapDBCall(String sql) {
        return "{call " + Constants.DB_PACKAGE_NAME + '.' + sql + '}';
    }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)