Итак, ваш первый «курсор» в области SGA, совершив работу, выдал «Hello World!«. Как он это сделал вы уже, наверное, успели немного разобраться! Давайте двигаться дальше. В прошлый раз мы просто вывели текст на экран и все проверив работу мантры! 🙂 Но от таких программ мало толку и по этому давайте сделаем что-то полезное. Как правило, самой простой программой, которой обычно начинают изучать какой либо язык, является калькулятор! Конечно же писать калькулятор на языке PL/SQL — это излишество, но для начала вполне приемлемо! Итак, давайте разберем пару блоков PL/SQL:
Давайте разбирать. В разделе DECLARE мы обьявили две переменных — A и B. Все переменные объявляются между оператором DECLARE и BEGIN! Затем в теле блока мы присвоили значениям переменных числа 3 и 5. Инициализация переменных может производиться либо при объявлении, либо в теле блока! Как вам больше нравиться! Например, можно было сделать вот так:
Далее при выводе результата мы прямо в теле метода put_line объявили сумму двух переменных. Но вернее было бы провести явное преобразование типа с помощью функции TO_CHAR() вот так:
В первом примере мы не сделали ошибки, а произошло неявное преобразование типа. Но мой совет делать именно так. Будет лучше читаться и меньше будете путаться! В данном случае можно записать более сложное выражение для наглядности и я думаю вам станет яснее почему я так делаю:
Хорошо виден приоритет унарных операций 12*3+5 = 41 — верно. Функция TO_NUMBER(), преобразует строковый литерал K в числовой литерал. С этими функциями преобразования мы еще не раз встретимся и, смею вас заверить, их очень много и будем разбирать их последовательно, так будет проще. Так же я разнообразно инициализировал переменные, что тоже не плохо, но лучше делать это одним способом, код будет более читаем. К стати можно записать и так:
Но все же явное преобразование более понятно, и не теряйте чувство реальности! Давайте более ближе посмотрим на литералы. Например можно записать:
Итак строковые литералы могут быть типов CHAR, VARCHAR2. В строковых литералах компилятор различает регистры символов. Давайте посмотрим, что здесь и как! Строковые литералы:
Хорошим стилем программирования является объявление и инициализация переменных. Если инициализировать переменную, нет необходимости, то инициализацию можно опустить. Типы переменных мы уже рассматривали, все они применимы при их объявлении. Так что, можете с этим поэкспериментировать и проверить все ли так как я вам рассказал! 🙂 Далее мы еще вернемся к созданию программы калькулятора.
Большинство программ PL/SQL работает только с базой данных Oracle через SQL . Однако время от времени возникает необходимость в передаче информации из PL/ SQL во внешнюю среду или чтении информации из внешнего источника (экран, файл и т. д.) в PL/SQL .
Пакет DBMS_OUTPUT предоставляет средства вывода информации из программ в буфер. Далее содержимое буфера читается и обрабатывается другой программой PL/SQL или управляющей средой. Пакет DBMS_OUTPUT чаще всего используется для простого вывода информации на экран.
Каждому пользовательскому сеансу выделяется буфер DBMS_OUTPUT заранее определенного размера. В OraclelOg Release 2 действовало ограничение в один миллион байтов. Когда буфер будет заполнен, его необходимо очистить перед дальнейшим использованием; это можно сделать на программном уровне, но чаще для очистки и вывода содержимого буфера используется управляющая среда (например, SQL*Plus ). Это происходит только после завершения внешнего блока PL/SQL ; пакет DBMS_OUTPUT не может использоваться для передачи сообщений из программы в реальном времени.
Запись информации в буфер выполняется при помощи программ DBMS_OUTPUT.PUT и DBMS_0UTPUT.PUT_LINE , а чтение на программном уровне — при помощи программ DBMS OUTPUT.GET LINE или DBMS OUTPUT.GET LINES .
Включение DBMS_OUTPUT
По умолчанию пакет DBMS_OUTPUT отключен, поэтому вызовы программ PUT_LINE и PUT игнорируются, а буфер остается пустым. Обычно включение DBMS_OUTPUT осуществляется специальной командой в управляющей среде. Например, в программе SQL*Plus выполняется следующая команда:
Кроме включения вывода на консоль, эта команда передает серверу базы данных следующую команду:
(Параметр buffer_size со значением NULL означает неограниченный буфер; также может передаваться конкретное значение размера в байтах.) SQL*Plus поддерживает ряд дополнительных параметров команды SERVEROUTPUT ; за дополнительной информацией обращайтесь к документации своей версии.
Среды разработки (например, Oracle SQL Developer или Quest Toad ) обычно выводят результаты DBMS_OUTPUT в специально назначенной части экрана — конечно, для этого вывод должен быть предварительно включен.
Запись в буфер
Запись информации в буфер осуществляется двумя встроенными процедурами: PUT_ LINE присоединяет маркер новой строки после текста, а PUT помещает текст в буфер без маркера новой строки. Информация, выведенная PUT , останется в буфере даже при завершении вызова. В этом случае следует вывести ее с очисткой буфера вызовом
Если Oracle знает, как неявно преобразовать ваши данные в строку VARCHAR2 , то эти данные можно передать при вызове программ PUT и PUT_LINE . Примеры:
К сожалению, DBMS_OUTPUT не умеет выполнять такое преобразование для многих распространенных типов PL/SQL , прежде всего для BOOLEAN . В таких случаях стоит написать небольшую утилиту, упрощающую вывод логических значений:
Максимальная длина строки, которая может передаваться за один вызов DBMS_OUTPUT. PUT_LINE , в последних версиях Oracle составляет 32 767 байт. В Oracle10g Release 1 и ранее действовало ограничение в 255 байт. В любой версии при передаче строки с длиной более допустимого максимума происходит исключение ( VALUE_ERROR или ORU-10028 ). Чтобы избавиться от этой проблемы, используйте инкапсуляцию DBMS_OUTPUT. PUT_LINE , которая автоматически разрывает длинные строки. В следующих файлах, доступных на сайте книги, представлены вариации на эту тему:
- pl.sp — автономная процедура позволяет указать длину разрыва строки.
- p.pks/pkb — пакет p представляет собой масштабную инкапсуляцию DBMS_OUTPUT. PUT_LINE с множеством разных перегрузок (например, вызовом процедуры p.l можно вывести документ XML или файл операционной системы), а также с возможностью разрыва длинного текста.
Чтение содержимого буфера
Типичный случай использования DBMS_OUTPUT весьма тривиален: разработчик вызывает DBMS_0UTPUT.PUT_LINE и просматривает результаты на экране. Клиентская среда (например, SQI*Plus ) «за кулисами» вызывает соответствующие программы пакета DBMS_OUTPUT для чтения и вывода содержимого буфера.
Для получения содержимого буфера DBMS_OUTPUT используются процедуры GET_LINE и/или GET_LINES .
Процедура GET_LINE читает одну строку из буфера по принципу «первым пришел, первым вышел» и в случае успешного завершения возвращает код 0. Пример использования программы для чтения следующей строки из буфера в локальную переменную PL/SQL :
Процедура GET_LINES читает несколько строк из буфера за один вызов. Данные загружаются в коллекцию строк PL/SQL (максимальная длина от 255 до 32 767 в зависимости от версии Oracle ). Вы указываете количество читаемых строк, а процедура возвращает их. Следующая программа записывает содержимое буфера DBMS_OUTPUT в журнальную таблицу базы данных:
dbms_output.put_line в Oracle SQL Developer
По умолчанию в Oracle SQL Developer (как и в SQL Plus) отключен вывод dbms_output в консоль.
Поэтому результатом выполнения такого блока Будет: Чтобы включить вывод, надо выполнить команду: После выполнения этой команды результатом работы блока будет:
Внимание.
Комментировать могут только зарегистрированные пользователи.
Возможно использование следующих HTML тегов: , , ,
.