Oracle dbms output включить

Обновлено: 06.07.2024

Описание общедоступных подпрограмм пакета можно получить с помощью команды SQL*Plus DESCRIBE. Команда показывает описание подпрограмм только в том случае, если спецификация пакета скомпилирована без ошибок, тело пакета при этом может отсутствовать.

SQL> CREATE OR REPLACE PACKAGE comm_package

3 g_comm NUMBER := 10;

4 FUNCTION avg_comm (v_comm NUMBER) RETURN NUMBER;

5 PROCEDURE max_comm (v_job VARCHAR2);

6 END comm_package;

SQL> DESCRIBE comm_package

FUNCTION AVG_COMM RETURNS NUMBER

Argument Name Type In/Out Default?

V_COMM NUMBER IN

Argument Name Type In/Out Default?

V_JOB VARCHAR2 IN

Поставляемые пакеты Oracle

Основные средства Oracle, например, встроенные функции, находятся в стандартном пакете Oracle, который имеет имя STANDART. Программные конструкции этого пакета автоматически доступны из любого блока PL/SQL любому пользователю базы данных. Если Вы обращаетесь к объектам стандартного пакета STANDART, имя пакета в качестве префикса указывать не обязательно.

Кроме пакета STANDART в поставку Oracle входит ряд пакетов, которыми могут пользоваться разработчики и администраторы базы данных. Эти пакеты отличаются префиксами имен: DBMS_ – пакеты для работы с базой данных, UTL_ – утилиты общего назначения. При обращении к объектам этих пакетов необходимо указывать имя пакета в качестве префикса к имени объекта.

Запуск пользовательских заданий в определенное время

Управление блокировками базы данных

Вывод строк текста в буфер для дальнейшего получения и вывода

Управление транзакциями SQL

Работа с большими объектами

ASCII операции чтения/записи системных файлов

DBMS_OUTPUT

Пакет DBMS_OUTPUT позволяет отображать информацию, выводимую из блоков PL/SQL, для их отладки и тестирования.

Процедуры и функции пакета формируют выходной буфер:

· Каждая строка буфера хранится в закрытой таблице PL/SQL

· Каждая строка буфера завершается символом новой строки

· Каждая строка буфера не должна превышать 255 байт, включая символ новой строки

· Размер буфера должен быть в диапазоне от 2000 до 1000000 байт

Процедуры и функции

Добавляет текст к текущей строке буфера

Добавляет символ конца строки в буфер. Несколько вызовов подряд не формирует пустые строки

Добавляет строку в буфер

Получает текущую строку буфера

Получает массив строк буфера

Включает/выключает вызов подпрограмм пакета. В процедуре ENABLE можно задать размер буфера

5 DBMS_OUTPUT.put('my string');

It is my string

PL/SQL procedure successfully completed.

DBMS_PIPE

Процедуры и функции

4 DBMS_PIPE.pack_message('It is my message');

5 l_var := DBMS_PIPE.send_message('p1');

PL/SQL procedure successfully completed.

3 l_msg VARCHAR2(50);

5 l_var := DBMS_PIPE.receive_message('p1');

It is my message

PL/SQL procedure successfully completed.

UTL_FILE

Пакет UTL_FILE позволяет читать из текстовых файлов операционной системы и писать в них.

Процедуры и функции

Функция открывает файл операционной системы и возвращает указатель на файл (тип данных – RECORD) для последующих операций

Процедура добавляет текст к текущей строке в открытом файле

Процедура добавляет символ конца строки к текущей строке в открытом файле

Процедура записывает текстовую строку с символом конца строки в открытый файл

Процедура читает текстовую строку из открытого файла операционной системы

Использование PL / SQL Developer для отладки хранимых процедур Oracle

Мы можем использовать инструмент разработчика PL / SQL для отладки сложных хранимых процедур Oracle

Для демонстрации мы определили хранимые процедуры test и test1, как показано ниже

В хранимой процедуре мы определяем несколько dbms_output.put_line () для вывода информации и отображения отладочного контента. Кроме того, мы определили внутренний вызов функции и вызвали функцию test1 в функции test.Так как Oracle не учитывает регистр, в средстве разработчика PL / SQL имена этих двух функций отображаются в верхнем регистре

Начать отладку

В расположении имени теста хранимой процедуры нажмите кнопку «вправо» и выберите «Тест»


В открытом тестовом окне нажмите F9 или нажмите кнопку «Начать отладчик»


После нажатия кнопки «Запустить отладчик» появляется следующий интерфейс


Среди них есть несколько кнопок, которые можно использовать отдельно в зависимости от ситуации.

1. Относится к прямому режиму работы и останавливается, когда точка останова установлена, когда точка останова установлена, в противном случае она работает до конца.

2, относится к одношаговому выполнению, выполняет каждый шаг оператора, когда оператор является пользовательской хранимой процедурой, вы можете ввести хранимую процедуру.

3, относится к одношаговому выполнению, выполняет каждый шаг оператора, когда оператор является настраиваемой хранимой процедурой, непосредственно получает результат выполнения, готовый выполнить следующий оператор.

4, относится к выполнению оставшихся операторов в теле функции и выпрыгивает из текущей функции, готовых выполнить следующий оператор в теле функции

5. Выполните оператор функции для курсора.

6. Выполните оператор в ненормальном месте, если нет ненормального выполнения до конца функции.

7, относится к выполнению связанных операторов SQL в сеансе отладки, этот метод не имеет смысла для физических таблиц, только когда процесс хранения включает в себя изменения во временной таблице Oracle, вам нужно просмотреть промежуточные результаты, нажав эту кнопку, введите во всплывающем окне Связанные операторы запроса для получения информации временной таблицы.

Просмотр значений переменных процесса

Значение переменной может быть установлено после выполнения одного шага, как показано на рисунке ниже

Итак, ваш первый "курсор" в области 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. В строковых литералах компилятор различает регистры символов. Давайте посмотрим, что здесь и как! Строковые литералы:

Хорошим стилем программирования является объявление и инициализация переменных. Если инициализировать переменную, нет необходимости, то инициализацию можно опустить. Типы переменных мы уже рассматривали, все они применимы при их объявлении. Так что, можете с этим поэкспериментировать и проверить все ли так как я вам рассказал! :) Далее мы еще вернемся к созданию программы калькулятора.

рис. Старый "дедовский" debug кода

рис. Старый "дедовский" debug кода

Добрый день! Работая разработчиком Oracle PL/SQL, часто ли вам приходилось видеть в коде dbms_output.put_line в качестве средства debug-а? Стоит признать, что к сожалению, большинство (по моему личному мнению и опыту) разработчиков Oracle PL/SQL не уделяет должного внимания логированию как к «спасательному кругу» в случае возникновения ошибок. Более того, большая часть разработчиков не совсем понимает зачем нужно логировать информацию об ошибках и самое главное, не совсем понимают что делать и как использовать эту информацию в будущем.

Предисловие

Данным постом хотел бы начать цикл статей посвященных «Логированию ошибок» в Oracle PL/SQL. В первую очередь донести мысль до многих разработчиков, о том как можно построить функционал фиксации, хранения логов в БД. На своем опыте продемонстрировать поэтапный процесс создания полноценного логирования в БД. Рассказать как нам удалось создать логирование ошибок, разработать единую нумерацию событий для их дальнейшей идентификации, как поверх логирования «натянуть» мониторинг событий, создать функционал позволяющий увидеть все текущие ошибки в БД в виде таблиц (с указанием частоты возникновения ошибок и кол-ва и т.д.), графиков (отразить динамику роста кол-ва ошибок) и правильно распределить ресурсы для устранения тех или иных ошибок.

Оговорюсь сразу, что на рынке возможно уже есть успешные существующие коммерческие продукты осуществляющие логирование гораздо лучше и качественнее хотя бы, потому что у них есть многолетний опыт внедрения и сопровождения своего продукта в различных компаниях. Я же хочу показать один из множества примеров реализации функционала логирования, которые вполне можно осуществить силами своих разработчиков.

Введение

Модель логирования позволяет реализовать:

Единый подход в обработке и хранении событий

Собственную нумерацию и идентификацию событий происходящих в БД (статья)

Единый мониторинг событий (статья в разработке)

Анализ событий происходящих в БД (статья в разработке)

Описанные выше характеристики указаны в порядке нумерации и каждый следующий пункт (шаг) есть улучшение и усложнение существующей модели. Описание этой модели будет сложно выполнить в рамках одной статьи, поэтому опишем их последовательно. Начнём с первого пункта.

Единый подход в обработке и хранении событий

Основной идеей "Единого подхода в обработке и хранении событий" заключается в создании одного одновременно простого и в тоже время очень сложного правила: "Все объекты базы данных (функции, процедуры) в обязательном порядке должны завершаться блоком обработки исключений с последующим логированием события". Простота заключается в том, что легко, в команде разработчиков, на словах договориться об исполнении данного правила. Сложность же заключается в том, что данное правило должно быть установлено на ранних этапах создания вашей БД и выполняться обязательно на протяжении всего жизненного цикла. Внедрить функционал логирования в уже существующие и действующие БД очень сложно (практически не возможно).

Все объекты базы данных (функции, процедуры) в обязательном порядке должны завершаться блоком обработки исключений с последующим логированием события. Для этого можно использовать шаблон процедуры (функции) описанный во второй статье.

Наверное сейчас кто-то из читателей может возразить: "Зачем в обязательном порядке?". А всё очень просто, если вы разработчик PL/SQL и вы не согласны с этим правилом, то вот вам пример. Посмотрите на свой текущий проект более внимательно. Скорее всего вы найдете какое-нибудь логирование событий реализованное кем-то, когда-то. Вспомните сколько раз вы обращались к этому логированию при решении багов. Именно в таких ситуациях, когда есть срочность по времени в исправлении бага, вы или ваши коллеги начинают использовать dbms_output.put_line в качестве экспресс-дебага (быстрый способ получения значений переменных используемых в коде). Согласитесь, что для исправления бага мало знать в какой процедуре, в каком запросе и на какой строке возникла ошибка, необходимо знать параметры запроса на которых возникает ошибка. И вот тут нам на помощь приходит "Логирование событий", потому что помимо места возникновения ошибки мы узнаем параметры вызова процедуры, в которой возникает ошибка и это очень упрощает исправление бага.

Первая статья посвящена базовому функционалу «Логирования событий». В простейшей реализации это одна общая таблица и пакет процедур для работы с ней. Для создания и демонстрации логирования, нам необходимо реализовать следующие объекты БД (весь список объектов с их исходными кодами представлен в Git):

Таблица messagelog - единая таблица логов. Именно в данной таблице будет храниться информация о дате и времени события, об объекте где происходит событие, типе события с указанием кода, текста и параметров. В нашем примере, столбец backtrace вынесен в отдельную таблицу messagelog_backtrace для удобства.

Примечание. Представленное ниже описание таблицы является демонстрационным с минимальным набором столбцов для создания простейшего функционала логирования. Наличие дополнительных столбцов и их тип данных может меняться в зависимости от целей и задач логирования.

Также, учитывайте пожалуйста, что создание партиции требует как минимум Oracle EE. Создание партиции вне указанной версии Oracle приведет к нарушению лицензионного соглашения.

Читайте также: