Можете посоветовать какие-то хитрости или трюки в решении следующей задачи:
Столкнулся с проблемой перевода огромного sql-запроса со множеством уровней вложенности, операторов case, операторов decode, вдобавок выбирающего данные из представления на plplus-ый синтаксис.
Есть ли какие-то автоматические переводчики (а вдруг?) или какие-то советы уже сталкивавшихся с подобной задачей товарищей?
вот этот великий и ужасный, нуждающийся в трансляции на цфт-ый синтаксис запрос
для удобства прочтения, приложил тот же запрос в виде файла
SELECT r.C_STORNO,
r.C_STORNO_NAME,
r.C_DT,
r.C_DATE_NOTRUNC c_date,
CASE
WHEN r.c_main_smart IS NOT NULL
AND (sm.C_ACC_DT = r.C_ACC_DT OR sm.C_ACC_KT = r.C_ACC_KT)
THEN
sm.c_nazn
ELSE
r.c_nazn
END
c_nazn,
CASE
WHEN r.c_main_smart IS NOT NULL
AND (sm.C_ACC_DT = r.C_ACC_DT OR sm.C_ACC_KT = r.C_ACC_KT)
THEN
sm.c_comment
ELSE
r.c_comment
END
c_comment,
SUBSTR (
‘ ‘
|| TRIM (
CASE
WHEN r.c_main_smart IS NOT NULL
AND (sm.C_ACC_DT = r.C_ACC_DT
OR sm.C_ACC_KT = r.C_ACC_KT)
THEN
sm.c_document_num
ELSE
r.c_document_num
END),
-8)
c_document_num,
r.c_summa_dt,
r.c_summa_dt_nat,
r.c_summa_kt,
r.c_summa_kt_nat,
r.C_MAIN_SMART,
CASE
WHEN r.c_main_smart IS NOT NULL
AND (sm.C_ACC_DT = r.C_ACC_DT OR sm.C_ACC_KT = r.C_ACC_KT)
THEN
sm.c_korr_v_id
ELSE
r.c_korr_v_id
END
c_korr_v_id
FROM (SELECT *
FROM (SELECT a.C_DOC_ID,
a.C_STORNO_NAME,
a.C_STORNO,
a.C_NAZN,
a.C_COMMENT,
a.C_DOCUMENT_NUM,
a.C_KORR_V_ID,
a.C_ACC_DT,
a.C_ACC_KT,
DECODE (
a.C_DT,
‘1’, NVL2 (
a.c_main_smart,
SUM (
a.C_SUMMA)
OVER (
PARTITION BY a.C_MAIN_SMART, a.C_DATE),
a.C_SUMMA),
0)
c_summa_dt,
DECODE (
a.C_DT,
‘1’, NVL2 (
a.c_main_smart,
SUM (
a.C_SUMMA_NAT)
OVER (
PARTITION BY a.C_MAIN_SMART, a.C_DATE),
a.C_SUMMA_NAT),
0)
c_summa_dt_nat,
DECODE (
a.C_DT,
‘0’, NVL2 (
a.c_main_smart,
SUM (
a.C_SUMMA)
OVER (
PARTITION BY a.C_MAIN_SMART, a.C_DATE),
a.C_SUMMA),
0)
c_summa_kt,
DECODE (
a.C_DT,
‘0’, NVL2 (
a.c_main_smart,
SUM (
a.C_SUMMA_NAT)
OVER (
PARTITION BY a.C_MAIN_SMART, a.C_DATE),
a.C_SUMMA_NAT),
0)
c_summa_kt_nat,
a.C_DT,
a.C_DATE,
a.C_DATE_NOTRUNC,
LAST_VALUE (a.c_doc_id)
OVER (PARTITION BY a.C_MAIN_SMART, a.C_DATE)
c_smart_last_doc,
a.C_MAIN_SMART
FROM VW_RPT_ACC_MOVE_LS a) r
WHERE c_doc_id = c_smart_last_doc OR c_main_smart IS NULL) r,
(SELECT a.ID c_main_smart,
a.c_date_notrunc,
a.c_date,
a.c_acc_dt,
a.c_acc_kt,
a.c_korr_acc,
a.c_korr_v_id,
a.c_document_num,
a.c_comment,
a.c_nazn,
a.c_storno,
a.c_storno_name
FROM vw_rpt_r_main_smart_dt a
UNION ALL
SELECT a.ID c_main_smart,
a.c_date_notrunc,
a.c_date,
a.c_acc_dt,
a.c_acc_kt,
a.c_korr_acc,
a.c_korr_v_id,
a.c_document_num,
a.c_comment,
a.c_nazn,
a.c_storno,
a.c_storno_name
FROM vw_rpt_r_main_smart_kt a) sm
WHERE r.c_main_smart = sm.c_main_smart(+)
ORDER BY r.C_DATE,
r.C_DT,
r.C_SUMMA_DT,
r.C_SUMMA_KT
Последний раз редактировалось: TAlex (Ср Мар 11, 2015 05:16), всего редактировалось 1 раз
Профи
Неподтвержденный
Ещё раз огромное вам спасибо
Эксперт
Неподтвержденный
Просто до этого я был (и до сих пор есть) разработчик под Siebel CRM, а разработкой под ИБСО занялся с одобрения начальства факультативно (лишние знания лишними не бывают).
И получается, что я, как сибелист, сижу с сибелистами. А ибсошники сидят отдельно. И приходится мне каждый раз к ним бегать с вопросами.
А самое плохое, что мне, как новичку в ИБСО, не назначили официального «учителя». По принципу, ты программист опытный, вот тебе дока, разберёшься. Поэтому приходится подходить с глупыми вопросами новичка то к одному исбошнику, то к другому.
Но ничего, втянулся вроде.
- PL/Plus
- Содержание
- [править] Основные особенности языка
- [править] История создания
- [править] Базовые типы данных
- [править] Выражения и операторы
- [править] Приоритет операторов
- [править] Функции и процедуры
- Основы языка PL/SQL
- Базовый блок PL/SQL
- Объявление переменных в PL/SQL
- Написание исполняемых операторов PL/SQL
- Использование оператора SELECT в PL/SQL
- Использование DML-операторов в PL/SQL
- Обработка ошибок
- Управляющие структуры в PL/SQL
- Условное управление
- Конструкции циклов в PL/SQL
- Простой цикл
- Цикл WHILE
- Цикл FOR
- Записи в PL/SQL
- Использование курсоров
- Неявные курсоры
- Явные курсоры
- Атрибуты курсоров
- Курсорный цикл FOR
- Курсорные переменные
- Процедуры, функции и пакеты
- Использование SQL*Plus для написания и запуск кода PL/SQL в Oracle
- Стас Белков
- Запуск SQL*Plus
- Выполнение SQL-инструкции
- Запуск программы на языке PL/SQL
- Запуск сценария
- Что такое «текущий каталог»?
- Другие задачи SQL*Plus
- Пользовательские установки
- Сохранение результатов в файле
- Выход из SQL*Plus
- Редактирование инструкции
- Автоматическая загрузка пользовательского окружения при запуске
- Обработка ошибок в SQL*Plus
- Достоинства и недостатки SQL*Plus
Видео:ШИФТ: дистанционный курс "Основы программирования PL/Plus"Скачать
PL/Plus
PL/Plus – это язык программирования со строгой типизацией и блочной структурой программы, ориентированный на работу с продуктами компании ЦФТ. Он позволяет выполнять последующую трансляцию кода на язык PL/SQL – внутренний язык СУБД Oracle, на которой базируются программные решения ЦФТ.
Видео:PL/SQL ФункцииСкачать
Содержание
Видео:Программирование в PL/SQL (ORACLE) Урок 1 (часть 1 из 3) / Илья ХохловСкачать
[править] Основные особенности языка
Язык PL/Plus не является объектно-ориентированными в полном объёме, поэтому, исходя из общепринятой терминологии объектно-ориентированного программирования (ООП) в настоящей модели принято следующее соответствие терминов:
Основной синтаксической единицей является модуль, состоящий из операции, принадлежащей определенному ТБП, а также описаний переменных, типов, функций и процедур, используемых как в самой операции, так и в других операциях.
Для упрощения работы с экземплярами ТБП на уровне языка PL/SQL, который ничего не знает о внутренних свойствах ТБП, для каждого ТБП создается так называемый интерфейсный пакет типа, который содержит в себе набор низкоуровневых базовых функций и процедур работы с экземплярами ТБП (создание, удаление экземпляров, чтение и изменение значений реквизитов и другие).
Препроцессор PL/Plus элементарные действия с экземплярами ТБП преобразует в PL/SQL вызовы базовых процедур интерфейсных пакетов типов, более сложные конструкции (аналоги SQL-операторов) преобразуются непосредственно в SQL-конструкции языка PL/SQL.
Из объектно-ориентированной модели язык PL/Plus использует также наследование.
Видео:Программирование в PL/SQL (ORACLE) Урок 1 (часть 2 из 3) / Илья ХохловСкачать
[править] История создания
Язык был создан с целью решения задач при использовании платформы:
Видео:#08 Основы работы в PL/SQL DeveloperСкачать
[править] Базовые типы данных
В языке PL+ используются предопределенные типы данных, которые можно разделить на несколько
Видео:Что такое SQL?Скачать
[править] Выражения и операторы
В зависимости от типов используемых значений и операторов, значение выражения может быть логическим, числовым, строковым или датой.
В выражениях, где операнды имеют разный тип данных не всегда очевидно какая операция должна выполняться и какого типа будет результат. В таких случаях PL+ попытается привести операнды к таким типам данных, чтобы операция имела смысл. Такое поведение называется неявным приведением типов.
Видео:Курс Oracle PL/SQL. Основы: Лекция 1. Введение в PL/SQLСкачать
[править] Приоритет операторов
В сложных смешанных выражениях могут присутствовать значения разных типов и операторы различных групп. В зависимости от порядка выполнения операторов может меняться не только результат выражения, но и его тип. Такие выражения вычисляются в соответствии с общим приоритетом операторов.
Но этот порядок может быть изменен с помощью скобок (), совсем как в арифметических выражениях. Выражения, заключенные в скобки, выполняются в первую очередь. Скобки тоже можно считать особым оператором и у них тоже есть приоритет.
Видео:DEV1-12. 11. Обзор и конструкции языка PL/pgSQLСкачать
[править] Функции и процедуры
Функция может возвращать данные практически любого типа от скаляров (строка, число, дата, логика) до сложных структур: коллекций, объектных типов, курсорных переменных и т. д.
Функция может вызываться из любой части исполняемой команды PL+, где допускается использование выражения. Следующие примеры демонстрируют вызовы функций:
В PL+, в отличие от PL/SQL, можно просто проигнорировать возвращаемое значение функции, если оно не представляет интереса для вас. То есть функцию можно использовать так, как если бы она была процедурой. Если функция не имеет параметров, ее вызов может записываться с круглыми скобками или без них.
Видео:#07. Основы работы в Oracle SQL DeveloperСкачать
Основы языка PL/SQL
Хотя язык SQL и является легким в изучении и обладает массой мощных функциональных возможностей, он не позволяет создавать такие процедурные конструкции, которые возможны в языках третьего поколения вроде C. Язык PL/SQL является собственным расширением языка SQL от Oracle и предлагает функциональность серьезного языка программирования. Одно из главных его преимуществ состоит в том, что он позволяет использовать в базе данных такие программные единицы, как процедуры и пакеты, и тем самым увеличивать возможность повторного использования кода и его производительность.
Видео:Уроки SQL для начинающих / #1 - Что такое SQL? Установка локального сервераСкачать
Базовый блок PL/SQL
Блоком в PL/SQL называется исполняемая программа. Блок кода PL/SQL, независимо от того, инкапсулируется он внутри какой-то программной единицы наподобие процедуры или задается в виде анонимного блока в свободной форме, состоит из следующих структур, которые представляют собой четыре ключевых оператора, только два из которых являются обязательными.
Ниже приведен пример простого блока кода PL/SQL:
Видео:Курс Oracle PL/SQL. Основы: Практика 1. Создание блоков PL/SQLСкачать
Объявление переменных в PL/SQL
В операторе DECLARE можно объявлять как переменные, так и константы. Прежде чем использовать какую-либо переменную ее нужно обязательно объявить. Переменная в PL/SQL может представлять собой как переменную встроенного типа, такого как DATE, NUMBER, VARCHAR2 или CHAR, так и составного вроде VARRAY. Помимо этого, в PL/SQL еще применяются такие типы данных, как BINARY_INTEGER и BOOLEAN.
Ниже приведены некоторые типичные примеры объявления переменной в PL/SQL:
Помимо переменных также можно объявлять и константы, как показано в следующем примере:
Еще можно использовать атрибут %TYPE и с его помощью указывать при объявлении переменной, что ее тип данных должен совпадать с типом данных определенного столбца таблицы:
Посредством атрибута %ROWTYPE можно указывать, что тип данных записи (строки) должен совпадать с типом данных определенной таблицы базы данных. Например, в следующем коде указано, что запись DeptRecord должна содержать все те же столбцы, что и таблица department, а типы данных и длина этих столбцов в ней должны выглядеть абсолютно идентично:
Видео:Программирование в PL/SQL (ORACLE) Урок 7 (часть 1 из 2) / Илья ХохловСкачать
Написание исполняемых операторов PL/SQL
После оператора BEGIN можно начинать вводить все свои желаемые SQL-операторы. Выглядеть эти операторы должны точно так же, как обычные операторы SQL. При использовании операторов SELECT и INSERT в PL/SQL, правда, необходимо помнить об особенностях, о которых более подробно речь пойдет в следующих разделах.
Использование оператора SELECT в PL/SQL
При использовании оператора SELECT в PL/SQL нужно сохранять извлекаемые значения в переменных, как показано ниже:
Использование DML-операторов в PL/SQL
Любые операторы INSERT, DELETE или UPDATE работают в PL/SQL точно так же, как в обычном SQL. Однако в PL/SQL после каждого из них можно также применять оператор COMMIT, как показано ниже:
Видео:Программирование в PL/SQL (ORACLE). Массивы, Циклы. ⭐⭐⭐⭐Скачать
Обработка ошибок
В PL/SQL любая ошибка или предупреждение называется исключением (exception). В PL/SQL есть кое-какие определенные внутренне ошибки, но также допускается определять и свои собственные. При возникновении любой ошибки инициируется исключение, и управление переходит в отвечающий за обработку исключений раздел программы PL/SQL. В случае определения своих собственных ошибочных ситуаций необходимо обеспечивать инициирование исключений за счет применения специального оператора RAISE.
Ниже приведен пример использования оператора RAISE для обработки исключений:
Видео:5 ХУДШИХ языков программирования, которые не стоит учить!Скачать
Управляющие структуры в PL/SQL
В PL/SQL предлагается несколько видов управляющих структур (control structures), которые позволяют обеспечивать итерацию кода или условное выполнение определенных операторов. Все они кратко описаны в последующих разделах моего блога.
Условное управление
Главной разновидностью условной управляющей структуры в PL/SQL является оператор IF, который обеспечивает условное выполнение операторов. Он может применяться в одной из трех следующих форм: IF-THEN, IF-THEN-ELSE и IF-THEN-ELSEIF. Ниже приведен пример простого оператора IF-THEN-ELSEIF:
Конструкции циклов в PL/SQL
Конструкции циклов в PL/SQL позволяют обеспечивать итеративное выполнение кода либо заданное количество раз, либо до тех пор, пока определенное условие не станет истинным или ложным. В следующих подразделах описываются основные виды этих конструкций.
Простой цикл
Конструкция простого цикла подразумевает помещение набора SQL-операторов между ключевыми словами LOOP и END LOOP. Оператор EXIT завершает цикл. Конструкция простого цикла применяется тогда, когда точно неизвестно, сколько раз должен выполняться цикл. В случае ее применения решение о том, когда цикл должен завершаться, принимается на основании содержащейся между операторами LOOP и END LOOP логики.
В следующем примере цикл будет выполняться до тех пор, пока значение quality_grade не достигнет 6:
Еще один простой вид цикла позволяет выполнять конструкция LOOP. EXIT. WHEN, в которой длительность цикла регулируется оператором WHEN. Внутри WHEN указывается условие, и когда это условие становится истинным, цикл завершается. Ниже показан простой пример:
Цикл WHILE
Цикл WHILE указывает, что определенный оператор должен выполняться до тех пор, пока определенное условие остается истинным. Обратите внимание на то, что условие вычисляется за пределами цикла, и вычисляется оно всякий раз, когда выполняются операторы, указанные между операторами LOOP и END LOOP. Когда условие перестает быть истинным, происходит выход из цикла. Ниже приведен пример цикла WHILE:
Цикл FOR
Цикл FOR применяется тогда, когда требуется, чтобы оператор выполнялся определенное количество раз. Он имитирует классический цикл do, который существует в большинстве языков программирования. Ниже приведен пример цикла FOR:
Видео:Урок10a.PL SQL.Циклы в PL SQLСкачать
Записи в PL/SQL
Записи (records) в PL/SQL позволяют воспринимать взаимосвязанные данные как одно целое. Они могут содержать поля, каждое из которых может представлять отдельный элемент. Можно использовать атрибут ROW%TYPE и с его помощью объявлять записью столбцы определенной таблицы, что подразумевает применение таблицы в качестве шаблона курсора, а можно создавать и свои собственные записи. Ниже приведен простой пример записи:
Для ссылки на отдельное поле внутри записи применяется точечное обозначение, как показано ниже:
Использование курсоров
Курсором (cursor) в Oracle называется указатель на область в памяти, в которой содержится результирующий набор SQL-запроса, позволяющий индивидуально обрабатывать содержащиеся в результирующем наборе строки. Курсоры, которые используются Oracle при выполнении DML-операторов, называются неявными, а курсоры, которые создают и используют разработчики приложений — явными.
Неявные курсоры
Неявные курсоры автоматически применяются Oracle всякий раз, когда в коде PL/SQL используется оператор SELECT. Они могут использоваться лишь в тех операторах, которые возвращают одну строку. В случае если SQL-оператор возвращает более одной строки, будет выдаваться сообщение об ошибке.
В приведенном ниже блоке кода PL/SQL оператор SELECT, например, предусматривает применение неявного курсора:
Явные курсоры
Явные курсоры создаются разработчиком приложения и облегчают операции с набором строк, которые могут обрабатываться друг за другом. Они применяются всегда, когда известно, что SQL-оператор будет возвращать более одной строки. Обратите внимание, что явный курсор необходимо всегда объявлять в начале блока PL/SQL внутри раздела DECLARE, в отличие от неявного курсора, на который никогда не нужно ссылаться в коде.
После объявления явного курсора он будет проходить через следующие этапы обработки.
В листинге А.4 показан пример создания курсора и затем его использования внутри цикла.
Атрибуты курсоров
В примере, приведенном в листинге А.4, для указания того, когда цикл должен завершаться, используется специальный атрибут курсора %NOTFOUND. Атрибуты курсоров очень полезны при работе с явными курсорами. Наиболее важные из них перечислены ниже.
Курсорный цикл FOR
Обычно при использовании явных курсоров требуется открывать курсор, извлекать данные и по завершении закрывать курсор. Курсорный цикл FOR позволяет выполнять эти процедуры по открытию, извлечению и закрытию автоматически, чем очень сильно упрощает дело. В листинге А.5 показан пример применения конструкции курсорного цикла FOR.
Курсорные переменные
Курсорные переменные указывают на текущую строку в многострочном результирующем наборе. В отличие от обычного курсора, однако, курсорная переменная является динамической, что позволяет присваивать ей новые значения и передавать ее другим процедурами и функциям. Создаются курсорные переменные в PL/SQL следующим образом.
Сначала определяется тип REF CURSOR, как показано ниже:
Затем объявляются сами курсорные переменные типа EmpCurType в анонимном блоке кода PL/SQL либо в процедуре (или функции):
Процедуры, функции и пакеты
Процедуры в PL/SQL могут применяться для выполнения различных DML-операций. Ниже приведен пример простой процедуры Oracle:
В отличие от процедур, функции в PL/SQL возвращают значение, как показано в следующем примере:
Пакеты (packages) в Oracle представляют собой объекты, которые обычно состоят из нескольких взаимосвязанных процедур и функций и, как правило, применяются для выполнения какой-нибудь функции приложения путем вызова всех находящихся внутри пакета взаимосвязанных процедур и функций. Пакеты являются чрезвычайно мощным средством, поскольку могут содержать большие объемы функционального кода и многократно выполняться несколькими пользователями.
Каждый пакет обычно состоит из двух частей: спецификации и тела. В спецификации пакета объявляются все входящие в его состав переменные, курсоры и подпрограммы (процедуры и функции), а в теле пакета содержится фактический код этих курсоров и подпрограмм.
В листинге А.6 приведен пример простого пакета Oracle.
При желании использовать пакет emp_pkg для награждения какого-то сотрудника надбавкой к зарплате, все, что потребуется сделать — выполнить следующую команду:
Использование SQL*Plus для написания и запуск кода PL/SQL в Oracle
Стас Белков
Автор статьи. Известный специалист в мире IT. Консультант по продуктам и решениям Oracle. Практикующий программист и администратор баз данных. Подробнее.
Предок всех клиентских интерфейсов Oracle — приложение SQL*Plus — представляет собой интерпретатор для SQL и PL/SQL, работающий в режиме командной строки. Таким образом, приложение принимает от пользователя инструкции для доступа к базе данных, передает их серверу Oracle и отображает результаты на экране.
При всей примитивности пользовательского интерфейса SQL*Plus является одним из самых удобных средств выполнения кода SQL и PL/SQL в Oracle. Здесь нет замысловатых «примочек» и сложных меню, и лично мне это нравится. Когда я только начинал работать с Oracle (примерно в 1986 году), предшественник SQL*Plus гордо назывался UFI — User Friendly Interface (дружественный пользовательский интерфейс). И хотя в наши дни даже самая новая версия SQL*Plus вряд ли завоюет приз за дружественный интерфейс, она, по крайней мере, работает достаточно надежно.
В предыдущие годы компания Oracle предлагала версии приложения SQL*Plus с разными вариантами запуска:
Начиная с Oracle11g, Oracle поставляет только консольную версию программы (sqlplus. exe).
Главное окно консольной версии SQL*Plus показано на рис. 1.
Рис. 1. Окно приложения SQL*Plus в консольном сеансе
Лично я предпочитаю консольную программу остальным по следующим причинам:
Oracle называет это «версией SQL*Plus с интерфейсом командной строки», но мы полагаем, что это определение не однозначно, поскольку интерфейс командной строки предоставляют два из трех способов реализации SQL*Plus.
Запуск SQL*Plus
Чтобы запустить консольную версию SQL*Plus, достаточно ввести команду sqlplus в приглашении операционной системы OS>:
Этот способ работает как в операционных системах на базе Unix, так и в операционных системах Microsoft. SQL*Plus отображает начальную заставку, а затем запрашивает имя пользователя и пароль:
Если появится приглашение SQL>, значит, все было сделано правильно. (Пароль, в данном случае swordfish, на экране отображаться не будет.) Имя пользователя и пароль также можно указать в командной строке запуска SQL*Plus:
Однако так поступать не рекомендуется, потому что в некоторых операционных системах пользователи могут просматривать аргументы вашей командной строки, что позволит им воспользоваться вашей учетной записью. Ключ /NOLOG в многопользовательских системах позволяет запустить SQL*Plus без подключения к базе данных. Имя пользователя и пароль задаются в команде CONNECT:
Если компьютер, на котором работает SQL*Plus, также содержит правильно сконфигурированное приложение Oracle Net1 и вы авторизованы администратором для подключения к удаленным базам данных (то есть серверам баз данных, работающим на других компьютерах), то сможете подключаться к ним из SQL*Plus. Для этого наряду с именем пользователя и паролем необходимо ввести идентификатор подключения Oracle Net, называемый также именем сервиса. Идентификатор подключения может выглядеть так:
Oracle Net — современное название продукта, который ранее назывался Net8 или SQL*Net.
Идентификатор вводится после имени пользователя и пароля, отделяясь от них символом «@»:
При запуске псевдографической версии SQL*Plus идентификационные данные вводятся в поле Host String (рис. 2.2). Если вы подключаетесь к серверу базы данных, работающему на локальной машине, оставьте поле пустым.
Рис. 2. Окно ввода идентификационных данных в SQL*Plus
После запуска SQL*Plus в программе можно делать следующее:
Рассмотрим поочередно каждую из перечисленных возможностей.
Выполнение SQL-инструкции
По умолчанию команды SQL в SQL*Plus завершаются символом «;» (точка с запятой), но вы можете сменить этот символ.
В консольной версии SQL*Plus запрос
выдает результат, подобный тому, который показан на рис. 1.
Запуск программы на языке PL/SQL
Итак, приступаем. Введите в SQL*Plus небольшую программу на PL/SQL:
После ее выполнения экран выглядит так:
Здесь я немного смухлевал: для получения результатов в таком виде нужно воспользоваться командами форматирования столбцов. Если бы эта книга была посвящена SQL*Plus или возможностям вывода данных, то я бы описал разнообразные средства управления выводом. Но вам придется поверить мне на слово: этих средств больше, чем вы можете себе представить.
Странно — наша программа должна была вызвать встроенную программу PL/SQL, которая выводит на экран заданный текст. Однако SQL*Plus по умолчанию почему-то подавляет такой вывод. Чтобы увидеть выводимую программой строку, необходимо выполнить специальную команду SQL*Plus — SERVEROUTPUT:
И только теперь на экране появляется ожидаемая строка:
Обычно я включаю команду SERVEROUTPUT в свой файл запуска (см. раздел «Автоматическая загрузка пользовательского окружения при запуске»). В таком случае она остается активной до тех пор, пока не произойдет одно из следующих событий:
При вводе в консольном или псевдографическом приложении SQL*Plus команды SQL или PL/SQL программа назначает каждой строке, начиная со второй, порядковый номер. Нумерация строк используется по двум причинам: во-первых, она помогает вам определить, какую строку редактировать с помощью встроенного строкового редактора, а во-вторых, чтобы при обнаружении ошибки в вашем коде в сообщении об ошибке был указан номер строки. Вы еще не раз увидите эту возможность в действии. Ввод команд PL/SQL в SQL*Plus завершается символом косой черты (строка 4 в приведенном примере). Этот символ обычно безопасен, но у него есть несколько важных характеристик:
Для удобства SQL*Plus предлагает пользователям PL/SQL применять команду EXECUTE, которая позволяет не вводить команды BEGIN, END и завершающую косую черту. Таким образом, следующая строка эквивалентна приведенной выше программе:
Завершающая точка с запятой не обязательна, лично я предпочитаю ее опустить. Как и большинство других команд SQL*Plus, команду EXECUTE можно сократить, причем она не зависит от регистра символов. Поэтому указанную строку проще всего ввести так:
Запуск сценария
Практически любую команду, которая может выполняться в интерактивном режиме SQL*Plus, можно сохранить в файле для повторного выполнения. Для выполнения сценария проще всего воспользоваться командой SQL*Plus @1. Например, следующая конструкция выполняет все команды в файле abc.pkg:
Файл сценария должен находиться в текущем каталоге (или быть указанным в переменной SQLPATH).
Если вы предпочитаете имена команд, используйте эквивалентную команду START:
и вы получите идентичные результаты. В любом случае команда заставляет SQL*Plus выполнить следующие операции:
По умолчанию SQL*Plus выводит на экран только результаты выполнения команд. Если вы хотите увидеть исходный код файла сценария, используйте команду SQL*Plus
В приведенном примере используется файл с расширением pkg. Если указать имя файла без расширения, произойдет следующее:
Как видите, по умолчанию предполагается расширение sql. Здесь «SP2-0310» — код ошибки Oracle, а «SP2» означает, что ошибка относится к SQL*Plus. (За дополнительной информацией о сообщениях ошибок SQL*Plus обращайтесь к руководству Oracle «SQL*Plus User’s Guide and Reference».)
Команды START, @ и @@ доступны в небраузерной версии SQL *Plus. В iSQL*Plus для получения аналогичных результатов используются кнопки Browse и Load Script.
Что такое «текущий каталог»?
При запуске SQL*Plus из командной строки операционной системы SQL*Plus использует текущий каталог операционной системы в качестве своего текущего каталога. Иначе говоря, если запустить SQL*Plus командой
все операции с файлами в SQL*Plus (такие, как открытие файла или запуск сценария) по умолчанию будут выполняться с файлами каталога C:BOBFILES. Если SQL*Plus запускается ярлыком или командой меню, то текущим каталогом будет каталог, который ассоциируется операционной системой с механизмом запуска. Как же сменить текущий каталог из SQL*Plus? Ответ зависит от версии. В консольной программе это просто невозможно: вы должны выйти из программы, изменить каталог средствами операционной системы и перезапустить SQL*Plus. В версии с графическим интерфейсом у команды меню FileOpen или FileSave имеется побочный эффект: она меняет текущий каталог. Если файл сценария находится в другом каталоге, то перед именем файла следует указать путь к нему:
С запуском сценария из другого каталога связан интересный вопрос: что, если файл abc.pkg расположен в другом каталоге и, в свою очередь, запускает другие сценарии? Например, он может содержать такие строки:
(Любая строка, начинающаяся с ключевого слова REM, является комментарием, и SQL*Plus ее игнорирует.) Предполагается, что сценарий abc.pkg будет вызывать сценарии abc.pks и abc.pkb. Но если информация о пути отсутствует, где же SQL*Plus будет их искать?
Оказывается, поиск выполняется только в каталоге, из которого был запущен исходный сценарий. Для решения данной проблемы существует команда @@. Она означает, что в качестве текущего каталога должен временно рассматриваться каталог, в котором находится выполняемый файл. Таким образом, команды запуска в сценарии abc.pkg следует записывать так:
Теперь результат выглядит иначе:
. как, собственно, и было задумано.
Косая черта может использоваться в качестве разделителей каталогов как в Unix/Linux, так и в операционных системах Microsoft. Это упрощает перенос сценариев между операционными системами.
Другие задачи SQL*Plus
SQL*PLus поддерживает десятки команд, но мы остановимся лишь на некоторых из них, самых важных или особенно малопонятных для пользователя. Для более обстоятельного изучения продукта следует обратиться к книге Джонатана Генника Oracle SQL*Plus: The Definitive Guide (издательство O’Reilly), а за краткой справочной информацией — к книге Oracle SQL*Plus Pocket Reference того же автора.
Пользовательские установки
Многие аспекты поведения SQL*Plus могут быть изменены при помощи встроенных переменных и параметров. Один из примеров такого рода уже встречался нам при применении выражения SET SERVEROUTPUT. Команда SQL*Plus SET также позволяет задавать многие другие настройки. Так, выражение SET SUFFIX изменяет используемое по умолчанию расширение файла, а SET LINESIZE n — задает максимальное количество символов в строке (символы, не помещающиеся в строке, переносятся в следующую). Сводка всех SET-установок текущего сеанса выводится командой
Приложение SQL*Plus также позволяет создавать собственные переменные в памяти и задавать специальные переменные, посредством которых можно управлять его настройками. Переменные SQL*Plus делятся на два вида: DEFINE и переменные привязки. Значение DEFINE-переменной задается командой DEFINE:
Чтобы просмотреть значение x, введите следующую команду:
Ссылка на данную переменную обозначается символом &. Перед передачей инструкции Oracle SQL*Plus выполняет простую подстановку, поэтому если значение переменной должно использоваться как строковый литерал, ссылку следует заключить в кавычки:
Переменная привязки объявляется командой VARIABLE. В дальнейшем ее можно будет использовать в PL/SQL и вывести значение на экран командой SQL*Plus PRINT:
Ситуация немного запутывается, потому что у нас теперь две разные переменные x: одна определяется командой DEFINE, а другая — командой VARIABLE:
Запомните, что DEFINE-переменные всегда представляют собой символьные строки, которые SQL*Plus заменяет их текущими значениями, а VARIABLE-переменные используются в SQL и PL/SQL как настоящие переменные привязки.
Сохранение результатов в файле
Выходные данные сеанса SQL*Plus часто требуется сохранить в файле — например, если вы строите отчет, или хотите сохранить сводку своих действий на будущее, или динамически генерируете команды для последующего выполнения. Все эти задачи легко решаются в SQL*Plus командой SPOOL:
Первая команда SPOOL сообщает SQL*Plus, что все строки данных, выводимые после нее, должны сохраняться в файле report.lst. Расширение lst используется по умолчанию, но вы можете переопределить его, указывая нужное расширение в команде SPOOL:
Вторая команда SPOOL приказывает SQL*Plus прекратить сохранение результатов и закрыть файл.
Выход из SQL*Plus
Чтобы выйти из SQL*Plus и вернуться в операционную систему, выполните команду EXIT:
Если в момент выхода из приложения данные записывались в файл, SQL*Plus прекращает запись и закрывает файл.
А что произойдет, если в ходе сеанса вы внесли изменения в данные некоторых таблиц, а затем вышли из SQL*Plus без явного завершения транзакции? По умолчанию SQL*Plus принудительно закрепляет незавершенные транзакции, если только сеанс не завершился с ошибкой SQL или если вы не выполнили команду SQL*Plus WHENEVER SQLERROR EXIT ROLLBACK (см. далее раздел «Обработка ошибок в SQL*Plus»).
Чтобы разорвать подключение к базе данных, но остаться в SQL*Plus, следует выполнить команду CONNECT. Результат ее выполнения выглядит примерно так:
Для смены подключений команда DISCONNECT не обязательна — достаточно ввести команду CONNECT, и SQL*Plus автоматически разорвет первое подключение перед созданием второго. Тем не менее команда DISCONNECT вовсе не лишняя — при использовании средств аутентификации операционной системы сценарий может автоматически восстановить подключение. к чужой учетной записи. Я видел подобные примеры.
Редактирование инструкции
SQL*Plus хранит последнюю выполненную инструкцию в буфере. Содержимое буфера можно отредактировать во встроенном редакторе либо в любом внешнем редакторе по вашему выбору. Начнем с процесса настройки и использования внешнего редактора.
Аутентификация операционной системы позволяет запускать SQL*Plus без ввода имени пользователя и пароля.
Команда EDIT сохраняет буфер в файле, временно приостанавливает выполнение SQL*Plus и передает управление редактору:
По умолчанию файл будет сохранен под именем afiedt.buf, но вместо этого имени можно выбрать другое (команда SET EDITFILE). Если же вы хотите отредактировать существующий файл, укажите его имя в качестве аргумента EDIT:
После сохранения файла и выхода из редактора сеанс SQL*Plus читает содержимое отредактированного файла в буфер, а затем продолжает работу.
По умолчанию Oracle использует следующие внешние редакторы:
Хотя выбор редактора по умолчанию жестко запрограммирован в исполняемом файле sqlplus, его легко изменить, присвоив переменной_EDITOR другое значение. Например, я часто использую следующую команду:
Здесь /bin/vi — полный путь к редактору, хорошо известному в среде «технарей». Я рекомендую задавать полный путь к редактору по соображениям безопасности.
Если же вы хотите работать со встроенным строковым редактором SQL*Plus (иногда это в самом деле бывает удобно), вам необходимо знать следующие команды:
Автоматическая загрузка пользовательского окружения при запуске
Для настройки среды разработки SQL*Plus можно изменять один или оба сценария ее запуска. SQL*Plus при запуске выполняет две основные операции:
Ни один из файлов не является обязательным. Если присутствуют оба файла, то сначала выполняется glogin.sql, а затем login.sql; в случае конфликта настроек или переменных преимущество получают установки последнего файла, login.sql.
А если не существует, но переменная SQLPATH содержит один или несколько каталогов, разделенных двоеточиями, SQL*Plus просматривает эти каталоги и выполняет первый обнаруженный файл login.sql.
Несколько полезных установок в файле login.sql:
Обработка ошибок в SQL*Plus
Способ, которым SQL*Plus информирует вас об успешном завершении операции, зависит от класса выполняемой команды. Для большинства команд SQL*Plus признаком успеха является отсутствие сообщений об ошибках. С другой стороны, успешное выполнение инструкций SQL и PL/SQL обычно сопровождается выдачей какой-либо текстовой информации.
Если ошибка содержится в команде SQL или PL/SQL, SQL*Plus по умолчанию сообщает о ней и продолжает работу. Это удобно в интерактивном режиме, но при выполнении сценария желательно, чтобы при возникновении ошибки работа SQL*Plus прерывалась. Для этого применяется команда
SQL*Plus прекратит работу, если после выполнения команды сервер базы данных в ответ на команду SQL или PL/SQL вернет сообщение об ошибке. Часть приведенной выше команды, SQL.SQLCODE, означает, что при завершении работы SQL*Plus установит ненулевой код завершения, значение которого можно проверить на стороне вызова. В противном случае SQL*Plus всегда завершается с кодом 0, что может быть неверно истолковано как успешное выполнение сценария. Другая форма указанной команды:
означает, что перед завершением SQL*Plus будет произведен откат всех несохраненных изменений данных.
Достоинства и недостатки SQL*Plus
Кроме тех, что указаны выше, у SQL*Plus имеется несколько дополнительных функций, которые вам наверняка пригодятся.
Например, с помощью системной переменной $? в Unix и %ERRORLEVEL% в Microsoft Windows.
Как и любые другие инструментальные средства, SQL*Plus имеет свои недостатки:
Итак, SQL*Plus не отличается удобством в работе и изысканностью интерфейса. Но данное приложение используется повсеместно, работает надежно и наверняка будет поддерживаться до тех пор, пока существует Oracle Corporation.