В клиентской программе на Java обращаться к БД через ссылку на курсор можно с помощью собственных расширений, сделанных фирмой Oracle в реализации ею драйвера JDBC. В программе ниже предполагается имя СУБД MYDB. Обратите внимание, что текст с запросом SQL передается нашему пакету объектом класса CallableStatement, а извлечение в программу ссылки на курсор делается после приведения этого объекта к сугубо Oracle’овскому классу OracleCallableStatement.
Получение в программу ссылки на курсор соответствует формированию объекта класса ResultSet, обработка которого делается стандартно.
Выдача второго запроса в программе ниже демонстрирует возможность использования одного и того же пакета для получения результата разной структуры. Очевидно, по своей гибкости эта техника находится посередине между тем, что имеется в PL/SQL и в SQL*Plus.
Подготовим файл GenericRefCursor.java: import java.sql.DriverManager; import java.sql.Connection; import java.sql.CallableStatement; import java.sql.ResultSet; import oracle.jdbc.driver.OracleCallableStatement; import oracle.jdbc.driver.OracleTypes;public class GenericRefCursor
{public static void main ( String[] args ) {
try { DriverManager.registerDriver ( new oracle.jdbc.driver.OracleDriver ( ) );
Connection cn; cn = DriverManager.getConnection ( "jdbc:oracle:oci:@mydb", "scott", "tiger" );
CallableStatement cst; OracleCallableStatement ocst; ResultSet rs;
cst = cn.prepareCall ( "BEGIN generic_ref_cursor.get_ref_cursor ( ?, ? ); END;" ); cst.setString ( 1, "SELECT sal FROM emp" ); cst.registerOutParameter ( 2, OracleTypes.CURSOR );
cst.execute ( );
ocst = ( OracleCallableStatement ) cst;
rs = ocst.getCursor ( 2 );
while ( rs.next ( ) ) { System.out.println ( rs.getInt ( 1 ) ); }
/* Новый запрос ... */ cst.setString ( 1, "SELECT dname, loc FROM dept" ); cst.execute ( ); rs = ocst.getCursor ( 2 ); while ( rs.next ( ) ) { System.out.println ( rs.getString ( 1 ) + rs.getString ( 2 ) ); }
/* ... и так далее, запрос за запросом */ cst.close ( ); } catch ( Exception e ){System.out.println ( e ); } }
}
В ОС оттранслируем класс GenericRefCursor и выполним программу: >javac GenericRefCursor.java >java GenericRefCursor