|
Программирование >> Oracle
Пакет DBMS OUTPUT 1701 Теперь все готово для демонстрации работы этого решения. Выполним процедуру, генерирующую данные в буфер, а затем посмотрим, как их выдать и что с ними можно делать: tkyte@TKYTE816> begin 2 my dbms output.put line(hello); 3 my dbms output.put(Hey ) ; 4 my dbms output.put(there ) ; 5 my dbms output.new line; 6 7 for i in 1 .. 2 0 8 loop 9 my dbms output.put line(rpad( , i, ) I 10 end loop; 11 end; 12 / PL/SQL procedure successfully completed. tkyte@TKYTE816> select * 2 from my dbms output peek TEXT hello Hey there 19 20 2 3 rows selected. Интересно, что утилита SQL*Plus, создатели которой ничего не знали о пакете MY DBMS OUTPUT, не в]дает результаты автоматически. Надо ей помочь, выполнив запрос, выдающий результаты. Поскольку для получения результатов используются SQL-операторы, вы легко сможете написать собственный класс DbmsOutput на языке Java/JDBC. Это будет простой объект ResultSet - ничего больше. В качестве последнего комментария к этому коду скажу, что результаты ожидают выборки в буфере: tkyte@TK:E816> select * 2 from my dbms output peek TEXT hello Hey there 1 1702 Приложение А 19 20 23 rows selected. Более того, при выборке можно задавать конструкцию WHERE, сортировать результаты, соединять их с другими таблицами и т.д. (как и для данных любой таблицы): tkyte@TKYTE816> select * 2 from my dbms output peek 3 where text like TEXT 18 19 11 rows selected. Если же повторное обращение к данным нежелательно, можно выбрать результаты с помощью оператора SELECT из представления MY DBMS OUTPUT VIEW: tkyte@TKYTE816> select * 2 from my dbms output view TEXT hello Hey there 1 23 rows selected. tkyte@TKYTE816> select * 2 from my dbms output view no rows selected В этом случае данные можно получить только один раз. Эта новая реализация пакета DBMS OUTPUT увеличивает допустимую длину строки с 255 байт до 4000 и фактически снимает ограничение на общий объем выдаваемых результатов (вы, однако, ограничены объемом оперативной памяти сервера). Она также предоставляет ряд новых возможностей (можно делать запросы к результатам, сортиро- Пакет DBMS OUTPUT 1703 вать их и т.д). Она позволяет избавиться от стандартного удаления начальных пробелов в среде SQL*Plus. Наконец, в отличие от пакета UTL FILE результаты MY DBMS OUTPUT можно сбросить в файл на клиенте точно так же, как и результаты пакета DBMS OUTPUT, что делает пакет MY DBMS OUTPUT достойной заменой DBMS OUTPUT для удаленного клиента. Вы можете спросить, почему я использовал при реализации объектный тип, а не временную таблицу. Причина в объеме кода и дополнительном расходе ресурсов. Объем кода для управления временной таблицей, связанного с добавлением столбца для запоминания порядка данных, по сравнению с этой простой реализацией окажется существенно больше. Кроме того, работа с временной таблицей требует ввода-вывода и дополнительного расхода ресурсов. Наконец, сложно реализовать представление со сбросом , когда буфер результатов автоматически очищается при выборке данных. Короче, использование объектного типа облегчает реализацию. Если бы я собирался использовать этот пакет для выдачи десятков мегабайт результатов, то пересмотрел бы способ буферизации и использовал временную таблицу. Для средних же объемов данных эта реализация вполне подходит. Резюме В этом разделе мы рассмотрели пакет DBMS OUTPUT. Теперь, зная, как он работает, вы не пострадаете от побочных эффектов этой реализации. Вы будете готовы к тому, что между запрошенным размером буфера и суммарным объемом результатов, которые можно в него выдать, иногда нет очевидной зависимости. Вы будете знать, что выдать строку результатов длиной более 255 байт нельзя. Результаты DBMS OUTPUT не выдаются, пока не завершится выполнение процедуры или оператора, но и тогда они будут выданы только при условии, что среда, из которой выполняются запросы, поддерживает пакет DBMS OUTPUT. Помимо анализа особенностей пакета DBMS OUTPUT мы рассмотрели способы обойти ограничения, связанные с его применением: для этого рекомендуется использование других средств. Можно использовать пакет UTL FILE для создания текстовых файлов с результатами или процедуры типа P, не только уменьшающие количество набираемых символов, но и обеспечивающие выдачу длинных строк. Можно реализовать и собственный пакет с аналогичными функциями, не имеющий подобных ограничений. Пакет DBMS OUTPUT - удачный пример того, как тривиальный на первый взгляд компонент может оказаться сложной программой с неожиданными побочными эффектами. Когда читаешь описание пакета DBMS OUTPUT в руководстве Oracle Supplied PL/SQL Packages Reference, все кажется простым и понятным. А потом неожиданно возникают проблемы с суммарным объемом выдаваемых результатов и т.п. Знание особенностей реализации пакета помогает избежать этих проблем.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |