Вызов хранимой процедуры Oracle PL / SQL из Java среднего уровня с использованием JDBC в Linux? - PullRequest
2 голосов
/ 04 марта 2012

Вопрос новичка ... Может ли кто-нибудь предоставить высокоуровневое описание того, что нужно сделать в хранимой процедуре PL / SQL (находящейся на сервере Linux базы данных) для отправки данных в программу Java (на сервере приложений)?

ОБНОВЛЕНИЕ 1

Ответ Эльрадо, приведенный ниже, продвинул меня вперед (спасибо!).Я вижу, что хранимая процедура PL / SQL просто должна установить параметр OUT как REF CURSOR (например, SYS_REFCURSOR).Затем вызывающая подпрограмма Java может использовать что-то вроде этого:

import oracle.jdbc.*;
...
// call stored procedure using SQL92 syntax
CallableStatement cs = conn.prepareCall( "{call myStoredProc (?,?,?,?,?)}" );

// set IN parameters
cs.setString(1, in1var);
cs.setString(2, in2var);
cs.setString(3, in3var);

// register OUT parameters
cs.registerOutParameter(4, Types.VARCHAR);
cs.registerOutParameter(5, OracleTypes.CURSOR);

// execute and retrieve Oracle "ref cursor" as a Java "ResultSet"
cs.execute();
rs = (ResultSet) cs.getObject(5);

// process result
while (rs.next()) {
  ...
}

// always retrieve ResultSet before OUT parameters
out1var = cs.getInt(4);

ВОПРОС 1: Вышеупомянутое выглядит хорошо?

Я вижу в документации Oracle (см. Страницы с 4-14 по 415 http://isu.ifmo.ru/docs/doc112/java.112/e10589.pdf) что я должен использовать OracleCallableStatement вместо CallableStatement, чтобы он выглядел так:

// execute and retrieve Oracle "ref cursor" as a Java "ResultSet"
cs.execute();
rs = {(OracleCallableStatement)cs}.getCursor(5);

ВОПРОС 2: Хорошо ли оба метода? Если да, то что«за» и «против» для использования одного над другим?

ВОПРОС 3: Я не понял примечание Important на странице 4-15 относительно базы данных Oracle 11G:

Unlike in past releases, the cursor associated with a REF CURSOR is not closed when the result set object in which the REF CURSOR was materialized is closed.

Означает ли это, что ref cursor закрывается при закрытии cs (в отличие от предыдущих выпусков базы данных, которые закрывались ref cursor при закрытии rs)?

1 Ответ

4 голосов
/ 04 марта 2012

Если вы хотите вернуть набор результатов из процедуры Oralce PL / SQL, используйте курсор ref:

http://www.oracle -base.com / Статьи / Разное / UsingRefCursorsToReturnRecordsets.php

Q1: Да, это выглядит нормально, но я не проверял это. 2: Я верю, что OracleCallableStatement просто расширяет CallableStatement. Оба хороши, но когда это возможно, я использую драйвер Oracle для подключения и работы с базой данных Oracle (а не с каким-то универсальным драйвером).

Q3: Я верю, что вы правы, и курсор остается открытым, когда вы закрываете набор результатов. (Прошло некоторое время с тех пор, как я читал набор результатов из процедуры, поэтому я не помню, когда закрывал курсор, извините. И сейчас я дома, и у меня нет доступа к Oracle db и моему рабочему компьютеру.)

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