Вопрос новичка ... Может ли кто-нибудь предоставить высокоуровневое описание того, что нужно сделать в хранимой процедуре 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
)?