Запустите хранимую процедуру Oracle в коде Java - PullRequest
2 голосов
/ 31 августа 2009

Я написал хранимую процедуру в Oracle и теперь хочу запустить ее в коде Java Я опишу проблему. У меня есть тип объекта:

TYPE PERSON_TYPE AS OBJECT (ID NUMBER(38), NAME VARCHAR2(20));

И тип таблицы:

TYPE PERSON_TYPE_TABLE AS TABLE OF PERSON_TYPE;

Моя процедура выглядит так:

PROCEDURE EVALUATE_PERSON_PROC(P_PERSON_ID IN NUMBER, return_data OUT NOCOPY PERSON_TYPE_TABLE) 
AS
--Some code
BEGIN
--Some code
END;

Как запустить эту процедуру в коде Java? Какие классы лучше для этого?

Ответы [ 2 ]

8 голосов
/ 31 августа 2009

Почему бы не использовать Абстракцию DAO Spring (очень полезная и достаточно легкая библиотека вокруг необработанного JDBC, которая устраняет необходимость в шаблонном коде), вы можете создать подкласс StoredProcedure класса.

class MySproc extends StoredProcedure {
    public MySproc(DataSource ds) {
       super(" { exec MY_SPROC ?, ? }", ds);
       declare(new SqlParameter("p1", Types.VARCHAR));
       declare(new SqlParameter("p2", Types.INT));
    }

    public void execute(String p1, int p2) {
        Map m = new HashMap();
        m.put("p1", p1);
        m.put("p2", p2);
        super.execute(m);
    }
}

Тогда это выполняется очень просто следующим образом:

new MySproc(ds).execute("Hello", 12);

Без базы данных Connection с, CallableStatement с в любом месте, чтобы увидеть. Прекрасный! О да, и он также предоставляет аннотации на основе Transaction s.

Если ваш sproc возвращает таблицу, это невероятно легко с помощью Spring. Просто объявите:

       declare(new SqlReturnResultSet("rs", mapper));

Где mapper - это экземпляр, который преобразует строку ResultSet в нужный объект. Затем измените свою строку:

        Map out = super.execute(m);
        return (Collection) out.get("rs");

Возвращаемое Collection будет содержать экземпляры объектов, созданных вашей реализацией mapper.

8 голосов
/ 31 августа 2009

Вам необходимо использовать CallableStatement class :

String sql = "{call EVALUATE_PERSON_PROC(?, ?)}";
CallableStatement statement = connection.prepareCall(sql);
...
statement.execute();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...