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

1 ... 422 423 424 [ 425 ] 426 427 428 ... 469


1698 Приложение А

ops$tkyte@ORA8I.WORLD> create or replace type my dbms output type

2 as table of varchar2(4000)

Type created.

Теперь переходим к спецификации пакета-аналога DBMS OUTPUT. Этот пакет устроен подобно DBMS OUTPUT. В нем нет только подпрограмм GET LINE и GET LINES, поскольку в нашей реализации они не нужны. Процедуры PUT, PUT UNE и NEW LINE работают точно так же, как их аналоги в пакете DBMSOUTPUT. функции GET, FLUSH и GET AND FLUSH - новые. Аналогов для них в пакете DBMSOUTPUT нет. Эти функции используются для получения результата после в1-полнения хранимой процедуры. Функция GET будет просто возвращать данные из буфера, но не стирать их. Можно вызывать функцию GET повторно для получения одного и того же содержимого буфера (пакет DBMS OUTPUT всегда сбрасывает буфер). Функция FLUSH позволяет сбросить буфер, другими словами, очистить его. Функция GET AND FLUSH, как можно догадаться, возвращает содержимое буфера и очищает его; следующие вызванные подпрограммы пакета будут работать с пустым буфером:

tkyte@TKYTE816> create or replace package my dbms output

2 as

3 procedure enable;

4 procedure disable;

6 procedure put(s in varchar2);

7 procedure put line(s in varchar2);

8 procedure new line; 9

10 function get return my dbms output type;

11 procedure flush;

12 function get and flush return my dbms output type;

13 end;

14 /

Package created.

Используем некоторые из методов, которые рассмотрены в главе 20, посвященной использованию объектно-реляционных средств. В частности, используем возможность выполнять операторы SELECT * from PLSQL FUNCTION - именно так и будет работать аналог пакета DBMS OUTPUT. Наибольший интерес представляют подпрограммы ENABLE, DISABLE, PUT, PUT LINE и NEW LINE. Они работают более-менее похоже на одноименные подпрограммы пакета DBMS OUTPUT. Основное различие в том, что процедура ENABLE не имеет параметров, а пакет MY DBMS OUTPUT по умолчанию выдает результаты (тогда как пакет DBMS OUTPUT по умолчанию их не выдает). Выдаваемые результаты ограничены объемом оперативной памяти, который вы можете выделить в системе (учтите это!). Рассмотрим тело пакета. Реализация этого пакета очень проста. Имеется глобальная переменная пакета, используемая в качестве буфера для результатов. Мы добавляем строки текста в буфер.выделяя при необходимости дополнительную память. Чтобы сбросить буфер, присваиваем ему пустую таблицу. Поскольку все так просто, я представлю реализацию без комментариев:



Пакет DBMS OUTPUT 1699

tkyte@TKYTE816> create or replace package body my dbms output 2 as 3

4 g data my dbms output type : = my dbms output type() ;

5 g enabled boolean default TRUE; 6

7 procedure enable

8 is

9 begin

10 g enabled := TRUE;

11 end; 12

13 procedure disable

14 is

15 begin

16 g enabled := FALSE;

17 end; 18

19 procedure put(s in varchar2)

20 is

21 begin

22 if (NOT g enabled) then return; end if; 2 3 if (g data.count <> 0) then

24 g data(g data.last) :=g data(g data.last) I I s;

25 else

2 6 g data.extend;

27 g data(l) := s;

28 end if;

29 end;

31 procedure put line(s in varchar2)

32 is

33 begin

34 if (NOT g enabled) then return; end if;

3 5 put(s);

3 6 g data.extend;

37 end; 38

39 procedure new line

40 is

41 begin

42 if (NOT g enabled) then return; end if;

43 put(null) ;

44 g data.extend;

45 end;

48 procedure flush

49 is

50 l empty my dbms output type := my dbms output type();

51 begin

52 g data := l empty;



1700 Приложение j

56 57 58 59

61 62 63 64 65

67 68 69

end;

function get return my dbms output type is

begin

return g data;

end;

function get and flush return my dbms output type is

l data l empty begin

g data := l empty;

my dbms output type := g data; my dbms output type := my dbms output type();

return l data;

end;

end;

Package body created.

Теперь, чтобы сделать пакет действительно полезным, необходим простой метод получения содержимого буфера. Можно вызывать функции MY DBMS OUTPUT.GET или GET AND FLUSH и выбирать содержимое переменной объектного типа самостоятельно или использовать одно из созданных ниже представлений. Первое представление, MY DBMS OUTPUT PEEK, обеспечивает SQL-интерфейс к функции GET. Оно позволяет многократно запрашивать данные из буфера результатов, фактически обеспечивая просмотр буфера без сброса результатов. Второе представление, MY DBMS OUTPUT VIEW, позволяет выполнить запрос к буферу один раз -любые последующие вызовы подпрограмм PUT, PUT LINE, NEW LINE, или GET AND FLUSH будут работать с пустым буфером результатов. Оператор SELECT * FROM MY DBMS OUTPUT VIEW аналогичен вызову функции DBMS OUTPUT.GET LINES. Буфер сбрасывается:

tkyte@TKYTE816> create or replace

2 view my dbms output peek (text)

3 as

4 select *

5 from TABLE (cast(my dbms output.get()

6 as my dbms output type))

View created.

tkyte@TKYTE816> create or replace

2 view my dbms output view (text)

3 as

4 select *

5 from TABLE (cast(my dbms output.get and flush()

6 as my dbms output type))

View created.



1 ... 422 423 424 [ 425 ] 426 427 428 ... 469

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