Программирование >>  Oracle 

1 ... 420 421 422 [ 423 ] 424 425 426 ... 469


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. Ее надо вызывать, если вы создали оператор



1 ... 420 421 422 [ 423 ] 424 425 426 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика