|
Программирование >> Oracle
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.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |