вторник, 28 апреля 2015 г.

Вызов хранимых процедур и функций в JDeveloper 12c

Доброго времени суток. При разработке ADF проектов,  очень редко можно обойтись без вызова хранимых процедур и функций из базы. JDeveloper не имеет plug&play компонентов для работы с ними. Сегодня я хочу показать вам  как  это можно сделать.

1. Создайте в БД функцию складывающую два числа

CREATE OR REPLACE FUNCTION SUMMAB
    (
      A IN NUMBER
    , B IN NUMBER
    ) RETURN NUMBER AS
    BEGIN
      RETURN  A + B;
    END SUMMAB;


2.  Откройте Application Module Class у вашего Application Module



Если  у вас отсутствует этот класс,  сгенерируйте его, как указано на картинках ниже 








3. Вставьте следующие два метода  в созданный ранее класс:



     protected Object callStoredFunction(int sqlReturnType, String stmt,
                                         Object[] bindVars) {
       CallableStatement st = null;
       try {
         st =
             getDBTransaction().createCallableStatement("begin ? := " + stmt + ";end;",
                                                        0);
         // 
         st.registerOutParameter(1, sqlReturnType);
         if (bindVars != null) {
           for (int z = 0; z < bindVars.length; z++) {
             st.setObject(z + 2, bindVars[z]);
           }
         }
         st.executeUpdate();
         return st.getObject(1);
       } catch (SQLException e) {
         throw new JboException(e);
       } finally {
         if (st != null) {
           try {
             st.close();
           } catch (SQLException e) {
           }
         }
       }
     }


      public Number getSumm(Number a, Number b)
    {   
        Number ret=null;
        try {
            ret = new Number(callStoredFunction(Types.NUMERIC, "SUMMAB(?,?)", new Object[] { a, b }));
        } catch (SQLException e) {
            System.out.println("sqlexception:"+e);
        }
        return ret;
        }



callStoredFunction - метод для вызова хранимых  процедур и функций. 
Входящие параметры: 
sqlReturnType - тип возвращаемых данных.
stmt - название процедуры
bindVars - входящие данные процедуры

Код у него внутри достаточно простой. При помощи метода getDBTransaction().createCallableStatement() создается экземпляр CallableStatement .
Объект CallableStatement предоставляет унифицированный способ вызова хранимых процедур. Подробнее об этом объекте можно прочитать здесь .  

getSumm - метод для вызова callStoredFunction, с указанными входящими параметрами.






4. Теперь, чтобы метод  getSumm для клиентов, необходимо его опубликовать в Client Interface в Application Module




Готово. В Oracle ADF Model Tester можно проверить его работу


Если раскрыть Data Controls вашего Application Module, можно увидеть этот метод : )