|
Программирование >> Oracle
1692 Приложение А Hello World PL/SQL procedure successfully completed. Пакет DBMS OUTPUT в других средах Стандартные средства, такие как SQL*Plus и SVRMGRL, учитывают особенности работы пакета DBMS OUTPUT. Большинство остальных сред - нет. Например, об1ч-ная программа на языке Java/JDBC о пакете DBMS OUTPUT ничего не знает . В этом подразделе мы рассмотрим, как учесть в такой программе особенности работы пакета DBMS OUTPUT. Такой же подход можно применить в любой среде программирования. Методы, использованные мной для языка Java, можно применить в среде Pro*C, OCI, VB и в любой другой среде. Начнем с небольшой PL/SQL-процедуры, генерирующей данные для вывода: scott@TKYTE816> create or replace 2 procedure emp report 3 as 4 begin 5 dbms output.put line 6 (rpadCpno , 7) 7 rpad(Ename,12) 8 rpad(Job,ll)); 10 dbms output.put line 11 (rpadC- , 5, -) 12 rpad(-,12,-) 13 rpadC -,11,-)); 15 for x in (select * from emp) 16 loop 17 dbms output.put line 18 (to char(x.empno, 9999) 19 rpad(x.ename, 12) 20 rpad(x.job, 11)); 21 end loop; 22 end; 23 / Procedure created. scott@TKYTE816> set serveroutput on format wrapped scott@TKYTE816> exec emp report Empno Ename Job 7369 SMITH CLERK 7 499 ALLEN SALESMAN 7934 MILLER CLERK PL/SQL procedure successfully completed. Пакет DBMS OUTPUT 1693 Теперь создадим класс, позволяющий работать с буфером пакета DBMS OUTPUT в среде Java/JDBC: import java.sql.*; class DbmsOutput { * Переменные экземпляра. Всегда лучше использовать вызываемые, * или подготовленные, операторы и готовить (анализовать) * их один раз при выполнении программы, а не при каждом выполнении * оператора. Повторный анализ требует очень больших ресурсов . Не забудьте также использовать СВЯЗЫВАЕМЫЕ ПЕРЕМЕННЫЕ! В этом классе мы используем три оператора. Один - для включения DBMS OUTPUT, аналог команды SET SERVEROUTPUT ON в SQL*Plus, второй - для выключения, подобно SET SERVEROUTPUT OFF. * Третий - для сброса или выдачи результатов вызовов DBMS OUTPUT * с помощью system.out. private CallableStatement enable stmt; private CallableStatement disable stmt; private CallableStatement show stmt; * Конструктор готовит три * оператора, которые предполагается выполнить. * * Оператор, который мы готова для SHOW, - это блок кода * для возврата строки результатов DBMS OUTPUT. Обычно * можно использовать тип PL/SQL-таблицы, но JDBC-драйверы * не поддерживают типы PL/SQL-таблиц. Поэтому мы получаем результат * и конкатенуем его в строку. Будем выбирать не более одной строки * результата, так что можем превзойти значение параметра MAXBYTES. * Если установить MAXBYTES равн 10, а первая строка еет длину 100 * байт, вы получите 100 байт. Параметр MAXBYTES не даст * получить следующую строку, но разбиения строки не произойдет. * public DbmsOutput(Connection conn) throws SQLException { enable stmt = conn.prepareCall ( sgin dbms output.enable (: 1) ; end; ) ; disable stmt = conn.prepareCall( begin dbms output.disable; end; ) ; show stmt = conn.prepareCall( declare + l line varchar2(255); + l done number; + l buffer long; + begin + loop + exit when length(l buffer)+255 > :maxbytes OR l done = 1; + 1694 Приложение А dbms output.get line(l line, l done); + l buffer := l buffer l line chr(10); end loop; + :done := l done; + :buffer := l buffer; + end; ) ; * ENLE задает размер и выполняет * вызов DBMS OOTPOTENABLE * public void enable(int size) throws SQLException enable stmt.setInt(l, size); enable stmt.executeUpdate(); * DISABLE просто вызывает DBMS OUTPUT.DISABLE */ public void disable() throws SQLException disable stmt.executeUpdate(); * Функция SHOW выполняет основную работу. Она циклически * выбирает данные DBMS OUTPUT, * по 32000 байт за раз (плюс-минус 255 байт) . * По умолчанию она выдает результат в стандартный * в1ходной поток (для перенаправления результатов * достаточно перенаправить System.out) . public void show() throws SQLException { int done = 0; show stmt.registerOutParameter(2, java.sql.Types.INTEGER); show stmt.registerOutParameter(3, java.sql.Types.VARCHAR); for(;;) show stmt.setInt(l, 32 000); show stmt.executeUpdate() ; System.out.print(show stmt.getString(3)); if ((done = show stmt.getInt(2)) = 1) break; Функция CLOSE закрывает все выполняемые операторы, связанные с классом DbmsOutput. Ее надо вызывать, если вы создали оператор
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |