|
Программирование >> Oracle
Пакет DBMS OUTPUT DbmsOutput и он выходит из области действия, как и для любого вызываемого оператора, результирующего множества и т.п. 1695 public void close() throws SQLException enable stmt.close(); disable stmt.close(); show stmt.close(); Чтобы продемонстрировать использование этого класса, я создал небольшую тестовую программу на языке Java/JDBC. Здесь dbserver - имя сервера базы данных, а ora8i - имя службы, соответствующей экземпляру: import java.sql.*; class test { public static void main (String args []) throws SQLException DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriverO); Connection conn = DriverManager.getConnection ( jdbc:oracle:thin:6dbserver:1521:ora8i , scott , tiger ); conn.setAutoCommit (false); Statement stmt = conn.createStatement(); DbmsOutput dbmsOutput = new DbmsOutput(conn); dbmsOutput.enable(1000000) ; stmt.execute ( sgin emp report; end; ) ; stmt.close() ; dbmsOutput.show(); dbmsOutput.close(); conn.close() ; Теперь протестируем программу, скомпилировав и выполнив ее: $ javac test.java $ java test Empno Ename Job 7 3 69 SMITH CLERK 7 499 ALLEN SALESMAN 7521 WARD SALESMAN 1696 Приложение А Итак, это показывает, как в языке Java использовать средства пакета DBMS OUTPUT. Как и в случае утилиты SQL*Plus, необходимо вызывать DbmsOutput.showO после в1-полнения оператора, выдающего какие-либо результаты. После выполнения оператора INSERT, UPDATE, DELETE или вызова хранимой процедуры утилита SQL*Plus в]зы-вает подпрограмму DBMS OUTPUT.GET LINES для получения результата. Приложение на языке Java (или С, или VB) должно вызывать функцию SHOW для выдачи результатов. Обход ограничений Я обнаружил два основных ограничения пакета DBMS OUTPUT: Длина строки ограничена 255 байтами. Символ новой строки надо вставлять не реже, чем через 255 байт. Общий объем выдаваемых результатов ограничен и находится в пределах от 200000 байт (если выдавать по одному байту в строке) до 992000 байт (если выдавать по 248 байт в строке). Для некоторых действий этого хватает, для других -недостаточно, особенно если учесть, что общий объем результатов, которые можно выдать, зависит от длины и порядка выдачи строк. Итак, что можно сделать? В следующих подразделах я предложу три способа обойти эти ограничения. Использование небольшой функции-оболочки или другого пакета Иногда 255 байт не хватает. Необходимо выдать отладочную информацию, и получается строка длиной 500 символов. Ее надо выдать, при этом не так важен формат, как возможность получить результаты. В этом случае можно написать небольшую подпрограмму-оболочку. Во всех моих базах данных установлена такая подпрограмма, позволяющая обойти ограничение длины строки и заодно сократить вызов, поскольку строка DBMS OUTPUT.PUT LINE состоит из 20 символов, что многовато для постоянного набора. Я часто использую процедуру Р. Вот эта процедура: procedure p(p string in varchar2) is l string long default p string; begin loop exit when l string is null; dbms output.put line(substr(l string, 1, 248)); l string := substr(l string, 251) ; end loop; end; Она не переносит переданную строку по словам и вообще ничего особенного не делает. Она принимает строку размером до 32 Кбайт и выдает ее. Длинную строку она разобьет на ряд строк размером 248 байт каждая (248 - оптимальное значение, кото- Пакет DBMS OUTPUT 1697 рое мы вычислили ранее; оно позволяет в]дать максимальный объем результатов). Процедура меняет данные (поэтому она не подходит для увеличения длины строки в процедуре, создающей текстовый файл), выдавая переданную строку в виде нескольких строк. Процедура решает простую проблему. Она позволяет избавиться от сообщения об ошибке: ops$tkyte@ORA8l.WORLD> exec dbms output.put line(rpad(*,256,*)) BEGIN dbms output.put line(rpad(*, 256,*)); END; ERROR at line 1: ORA-20000: ORU-10028: line length overflow, limit of 255 bytes per line ORA-06512: at SYS.DBMS OUTPUT , line 99 ORA-06512: at SYS.DBMS OUTPUT , line 65 ORA-06512: at line 1 получаемого при выдаче отладочной информации или печати отчета. Более надежный способ обойти это ограничение, особенно при сбросе данных в текстовый файл, - использовать вместо пакета DBMS OUTPUT средства пакета UTL FILE для записи непосредственно в файл. Пакет UTLFILE ограничивает размер выдаваемой строки 32 Кбайтами и не ограничивает размер файла. С помощью пакета UTL FILE можно создавать файлы только на сервере, так что это решение не подойдет, если предполагается использование утилиты SQL*Plus на клиенте, подключенном по сети, с выдачей результатов в локальный файл на клиенте. Если же необходимо создать текстовый файл данных для загрузки и его создание на сервере допустимо, пакет UTL FILE вполне можно использовать. Итак, мы рассмотрели две из трех возможностей. Переходим к последней. Создание аналога пакета DBMS OUTPUT Это универсальное решение, хорошо работающее во всех средах. Мы собираемся заново изобрести велосипед, но велосипед более совершенный. Создадим пакет-аналог DBMSOUTPUT, который: ограничивает длину строки 4000 байтами (это, к сожалению, ограничение языка SQL, а не PL/SQL); не ограничивает количество выдаваемых строк; позволяет получать результаты на клиенте, как и пакет DBMS OUTPUT; не позволяет утилите SQL*Plus удалять начальные пробелы в строке, независимо от режима; позволяет выбирать результаты как результирующее множество на клиенте с по- мощью курсора (к результату можно будет делать запросы). Начнем с создания SQL-типа. Этот тип будет использоваться для буфера, аналогичного тому, что применяется в пакете DBMS OUTPUT. Поскольку это SQL-тип, можно применять к данным операторы SELECT *. Поскольку практически в любой среде можно выполнить оператор SELECT *, выдать результаты не представит сложности.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |