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

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


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



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

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