Sql pl циклы: Основы циклов в PL/SQL Oracle

Содержание

PL/SQL Цикл по полям.

 
Курдль
 
(2008-08-22 17:37)
[0]

Коллеги!
Возможно ли в триггере организовать цикл по полям таблицы?
Это нужно для замысловатого журналирования написать триггера почти на все таблицы, чтобы вычислять изменившиеся поля и писать их в логи. На SQL.ru искал решения — но нашел только такие же вопросы без ответов…


 
Правильный$Вася
 
(2008-08-22 18:36)
[1]

FOR x IN( SELECT * FROM User_Tab_Cols WHERE table_name = ...


 
Игорь Шевченко ©
 
(2008-08-22 18:53)
[2]


> Это нужно для замысловатого журналирования написать триггера
> почти на все таблицы, чтобы вычислять изменившиеся поля
> и писать их в логи.

А как ты себе это представляешь ?

IF :NEW||col_name <> :OLD||col_name THEN
 log_record_change ?

проще триггер сгенерировать программно или использовать Oracle Workspace Manager для ведения истории записей


 
Труп Васи Доброго ©
 
(2008-08-22 21:12)
[3]


> чтобы вычислять изменившиеся поля и писать их в логи.

А чем тебе сам триггер не угодил? Зачем «вычислять» изменивщиеся поля, если при каждом изменении записи вызывается триггер, вот и сравнивай в нём, как Игорь предложил
> IF :NEW||col_name <> :OLD||col_name THEN

А дальше делай что угодно.
Такое ощущение, что либо ты не понимаешь что такое триггер и как он работает, либо ты не корректно описал задачу. Поясни плиз.


 
Игорь Шевченко ©
 
(2008-08-23 09:35)
[4]

Труп Васи Доброго ©   (22. 08.08 21:12) [3]

То, что я предложил — это несколько нонсенс 🙂


 
Petr V. Abramov ©
 
(2008-08-23 11:00)
[5]


> Это нужно для замысловатого журналирования написать триггера
> почти на все таблицы, чтобы вычислять изменившиеся поля
> и писать их в логи.

тогда лучше в сторону logminer погляди
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_logmnr.htm#i79049


 
Petr V. Abramov ©
 
(2008-08-23 12:04)
[6]

или 11g с Total Recall
http://www.oracle.com/database/total-recall.html

P.S.
> Курдль
на DATABASE OPTIONS DETAILS 18.09 пойдешь?


 
Курдль
 
(2008-08-25 09:34)
[7]


> А как ты себе это представляешь ?
> IF :NEW||col_name <> :OLD||col_name THEN
>  log_record_change ?
> проще триггер сгенерировать программно или использовать
> Oracle Workspace Manager для ведения истории записей

Ага! 🙂 Жаль, нет смайлика типа из м/ф «Вовка в Тридевятом царстве»: «А вы и есть за меня будете? — Ага!»
Именно так и хотелось бы.
Дело в том, что я не разработчик. И не заказчик. А где-то в промежности. 🙁
Заказчики, как всегда, заказали немного криво, а подрядчики, как всегда, добавили кривизны. Требовать от последних при всех доработках еще и журналирование по полной схеме поддерживать — нереально (это не входило в ФТ). А включить в один change request «всеобъемлющий скрипт» — еще можно было бы договориться.


> Petr V. Abramov ©   (23.08.08 12:04) [6]
> на DATABASE OPTIONS DETAILS 18.09 пойдешь?

А меня туда никто не приглашал 🙁
Я как-то в последнее время в BI-тусовке прижился.


 
Игорь Шевченко ©
 
(2008-08-25 09:52)
[8]

Курдль   (25.08.08 09:34) [7]


> Ага! 🙂 Жаль, нет смайлика типа из м/ф «Вовка в Тридевятом
> царстве»: «А вы и есть за меня будете? — Ага!»
> Именно так и хотелось бы.

Я бы программно сгенерировал такой триггер (такие триггеры), а что — набор полей есть, логику ты знаешь, раз уж обычного AUDIT-а недостаточно


 
Petr V. Abramov ©
 
(2008-08-25 11:32)
[9]


> Игорь Шевченко ©   (25.08.08 09:52) [8]

аудит
> почти на все таблицы
это жесть.
так же, как и триггеры


 
Игорь Шевченко ©
 
(2008-08-25 11:52)
[10]

Petr V. Abramov ©   (25.08.08 11:32) [9]


> аудит
> > почти на все таблицы
> это жесть.

И че ? Есть заказчики, которые желают знать, кто именно и что изменил. Их полное и неотъемлемое право


 
Курдль
 
(2008-08-25 13:22)
[11]


> Игорь Шевченко ©   (25.08.08 11:52) [10]
> И че ? Есть заказчики, которые желают знать, кто именно
> и что изменил. Их полное и неотъемлемое право

Кстати, я давно уже интересуюсь гранью, когда пора уж будет переходить на хранилища данных во всех ипостасях (в части, касающейся «историзации» данных).
Даже ветку хотел завести на тему «нормальная форма и версионность/историзация — как им ужиться?».


 
Курдль
 
(2008-08-25 14:01)
[12]


> Petr V. Abramov ©   (25.08.08 11:32) [9]
> это жесть.
> так же, как и триггеры

Чем тебе триггеры-то не угодили?
Это, на мой взгляд, единственная ценность из всей серверной логики.


 
Игорь Шевченко ©
 
(2008-08-25 14:57)
[13]


> Это, на мой взгляд, единственная ценность из всей серверной
> логики.

В серверной логике немножко больше ценностей, например, view и пакеты 🙂
Но главная ценность в серверной логике — это то, что можно не гонять данные туда-сюда, обсчитывая ту самую логику.


 
Курдль
 
(2008-08-25 15:12)
[14]


> Игорь Шевченко ©   (25. 08.08 14:57) [13]
> Но главная ценность в серверной логике — это то, что можно
> не гонять данные туда-сюда, обсчитывая ту самую логику.

Я уж спорил на эту тему с Ю.Зотовым и Petr V. Abramov за пивом.
И мне казалось, что привел весомые аргументы.
Гонять данные — это, конечно, не кошерно. И я против выполнения логики на клиенте. Я — за трехзвенку с мощным сервером приложений.
Вот мои аргументы.
1. В проекте накладно содержать много разнородных разработчиков.
2. Трудно поддерживать повторяемость в проектах под разные СУБД.
3. В то время, когда программирование продвинулось от процедурного к объектному, а уж не за горами и победа паттернов, — СУБД только делают неуклюжие попытки перейти к объектному программированию.


 
Игорь Шевченко ©
 
(2008-08-25 16:45)
[15]

Курдль   (25.08.08 15:12) [14]


> Я уж спорил на эту тему с Ю. Зотовым и Petr V. Abramov за
> пивом.

Будет желание и возможность — можешь и со мной за пивом поспорить.


> 2. Трудно поддерживать повторяемость в проектах под разные
> СУБД.

Собственно, разрабатывать относительно большой проект под разные СУБД особо большого смысла не имеет — получится «плохой под разные СУБД» проект, слово «плохой» можно смело заменить на «неоптимальный».

Мало того, что все СУБД отличаются в механизмах работы, каждый их механизм встроен в СУБД и оптимизирован, следовательно, работает всяко быстрее (и надежнее), чем попытки его имитации на клиенте любого рода, будь то толстый клиент или сервер приложений.

Я Кайта процитирую:

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

Ну и кроме всего прочего, стоимость СУБД обычно несопоставима со стоимостью большого корпоративного приложения. ..


 
Курдль
 
(2008-08-25 17:24)
[16]


> Игорь Шевченко ©   (25.08.08 16:45) [15]
> Будет желание и возможность — можешь и со мной за пивом поспорить.

Да леГко! 🙂  Только Савелия не предлагать. Я туда в разумное время не доеду.
Мой ареал — между ЦАО и ВАО.

Кстати, я в своих аргументах против серверной логики о «мультибазовых» проектах не упоминал.
Я говорил про технологическую вооруженность софтверной компании.
Кайт — мужчинка уважаемый. Но он, кажись, и говорил, что «при проектировании БД самый худший враг — догматизм».
Про авторитетность зерцал IT-шных наук. Я с интервалом в год имел удовольствие присутствовать на семинарах с участием 2-х главных светил в области хранилищ данных — Р.Кимбалла и Б.Инмона (который первый и ввел в обиход словосочетание ХД). Так у них чуть ли не диаметрально противоположные архитектурные подходы. Однако — у обоих десятки внедренных с успехом проектов уровня «Пентагон» за плечами.
И еще пример из области ХД.
Признанный лидер в области нитеграции — Informatica создала средство ETL Informatica Power Center, который служит для извлечения данных из БД-источников, их трансформации и загрузки в БД-приемники. Так вот — он работает на собственном сервере приложений и выполняет коды специализированных программ.
А oracle Data Integrator и тем более Oracle Warehouse Builder, нацеленные на создание скриптов и процедур для исполнения СУБД, далеко отстают от Informatica.


 
Игорь Шевченко ©
 
(2008-08-25 17:40)
[17]


> Да леГко! 🙂  Только Савелия не предлагать. Я туда в разумное
> время не доеду.
> Мой ареал — между ЦАО и ВАО.

Э…пораньше бы 🙂 Сдается мне, что на ближайшее время у меня будет строго САО.

Что касается примеров — оно все конструкторы, и ETL Informatica Power Center и «oracle Data Integrator и тем более Oracle Warehouse Builder» — то есть, дается полуфабрикат и пара дюжин напильников, которыми этот полуфабрикат доводится до приемлемого в использовании продукта.
Может, оно и неплохо, может, и очень неплохо, но я веду речь о готовых продуктах, за которые конечный заказчик денег платит, разработкой каковых я, собственно, и занимаюсь. И делать в этом случае конструктор, прикладывая к нему кучу напильников, мне не слишком улыбается, еще и по той причине, что продукт довольно специализирован, знаний по предметке накоплено достаточно, узкие места и способы их обхода примерно известны. Так что заказчику проще приобрести оракл 🙂


 
Германн ©
 
(2008-08-26 01:49)
[18]

Эээ.
Вы давайте продолжать рассуждения о
> Трудно поддерживать повторяемость в проектах под разные
> СУБД.

и
> Собственно, разрабатывать относительно большой проект под
> разные СУБД особо большого смысла не имеет — получится «плохой
> под разные СУБД» проект, слово «плохой» можно смело заменить
> на «неоптимальный».
>

О пиве и о местонахождении (географии административных округов) можно «потрепаться» в соответствующей конференции. 🙂

«По-ммедленнее, пожалуйста. Я записсываю.»
(с) Шурик


 
Германн ©
 
(2008-08-26 02:01)
[19]

Я серьёзно. Я действительно «записываю».
Для меня это весомый аргумент в разговоре с т.н. «техническим» «директором».
И не случайно я поставил кавычки два раза.


 
Курдль
 
(2008-08-26 09:23)
[20]


> Германн ©   (26.08.08 02:01) [19]
>
> Я серьёзно. Я действительно «записываю».
> Для меня это весомый аргумент в разговоре с т.н. «техническим»
> «директором».
> И не случайно я поставил кавычки два раза.

А что, собственно, надо оспорить или защитить?
Я о «мультибазовых» проектах не упоминал. Но я не против них. Более того, я участвовал в одном таком. Просто не надо питать иллюзий, что можно создать коробочную версию системы, чтобы, типа, при установке она спросила: «На Вашем ПК обнаружены следующие 3 СУБД: …  Какую из них выбрать?».
Просто если для кастомизации под конкретную СУБД потребуется 10% от проектного ресурса — это хороший результат. Но достичь его будет немыслимо, если серверную логику повесить на СУБД.


 
Игорь Шевченко ©
 
(2008-08-26 09:42)
[21]

Курдль   (26.08.08 09:23) [20]


> Просто если для кастомизации под конкретную СУБД потребуется
> 10% от проектного ресурса — это хороший результат. Но достичь
> его будет немыслимо, если серверную логику повесить на СУБД.
>

Да, конечно, достичь такого результата немыслимо не только, если повесить логику на СУБД. СУБД, они не только имеют разные средства для создания серверной логики, они еще и ведут себя по-разному в отношениях с клиентами.

Опять же, процитирую Кайта:
«Фундаментальные модели согласованности и управления параллелизмом разных баз данных радикально отличаются друг от друга. Последовательность операторов в одной базе данных может, а иногда и будет приводить к результату, отличному от результатов в другой базе данных».

Из этого, увы, следует, что для того, чтобы разрабатывать надежные приложения не зависящие от СУБД или делать «кастомизацию» под разные СУБД необходимо иметь в команде разработчиков людей, которые ориентируются во внутренностях конкретной СУБД, как поп в Ветхом законе.

Весьма вероятно, что твой вопрос в какой-то из СУБД (про поля в триггере) решается легко и просто, а вот в Oracle, увы, не решается, да оно и не надо 🙂


 
Курдль
 
(2008-08-26 11:28)
[22]


> Из этого, увы, следует, что для того, чтобы разрабатывать
> надежные приложения не зависящие от СУБД или делать «кастомизацию»
> под разные СУБД необходимо иметь в команде разработчиков
> людей, которые ориентируются во внутренностях конкретной
> СУБД, как поп в Ветхом законе.

Приведи пример (не касающийся оговоренного триггера).
Матерые ораклисты с презрением смотрят на мой ораклевый код «…left outer join … on …». Однако, он в оракле работает ничуть не хуже, чем «(+) = «. (Кстати, СУБД оракл иногда ругается на нее, как на устаревшую).
Где должна проявиться особо узкая специализация разработчиков? 99% запросов можно исполнить на классическом ANSI.


 
Игорь Шевченко ©
 
(2008-08-26 11:47)
[23]

Курдль   (26.08.08 11:28) [22]


> Приведи пример (не касающийся оговоренного триггера).

Том Кайт, «Эффективное проектирование приложений Oracle», стр. 17


> 99% запросов можно исполнить на классическом ANSI.

Исполнить можно. Результаты могут отличаться


> Матерые ораклисты с презрением смотрят на мой ораклевый
> код «…left outer join … on …». Однако, он в оракле
> работает ничуть не хуже, чем «(+) = «.

Ну это же просто синонимы…


 
Petr V. Abramov ©
 
(2008-08-26 12:19)
[24]


> И че ? Есть заказчики, которые желают знать, кто именно
> и что изменил. Их полное и неотъемлемое право

это уже все написано в логах. есть инструмент, чтоб логи разобрать. Нафига городить тыщу дурацких триггеров и тормозить базу?


 
Курдль
 
(2008-08-26 13:31)
[25]


> Petr V. Abramov ©   (26.08.08 12:19) [24]
>
>
> > И че ? Есть заказчики, которые желают знать, кто именно
> > и что изменил. Их полное и неотъемлемое право
>
> это уже все написано в логах. есть инструмент, чтоб логи
> разобрать. Нафига городить тыщу дурацких триггеров и тормозить
> базу?

Конгениально, коллега!

Только надо знать особенности организационной структуры и информационной безопасности в конкретной компании!
Если логи доступны DB-админам, находящимся в другом конце города и вовсе не напрашивающимся (мягко говоря) на доп. работу?

А «торможение триггерами» могу себе представить только в хранилищах данных, где критичны периоды массовой загрузки информации. В OLTP-системах такой триггер отработает незаметно.


 
Sergey Masloff
 
(2008-08-26 22:50)
[26]

Petr V. Abramov ©   (26.08.08 12:19) [24]

>это уже все написано в логах. есть инструмент, чтоб логи разобрать. >Нафига городить тыщу дурацких триггеров и тормозить базу?
Торможения нет проверялось…

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


 
Sergey Masloff
 
(2008-08-26 22:51)
[27]

Действительно на DATABASE OPTIONS DETAILS 18.09 кто еще идет? Я пока точно не знаю но с вероятностью 50% пойду


 
Petr V. Abramov ©
 
(2008-08-27 01:26)
[28]

Удалено модератором


 
Petr V. Abramov ©
 
(2008-08-27 01:30)
[29]

опять же:
поле в таблице рпибавили/убавили.
софт д.б. чтоб триггеры по крайней мере valid остались.


 
Германн ©
 
(2008-08-27 01:33)
[30]


> Курдль   (26. 08.08 09:23) [20]
>
> А что, собственно, надо оспорить или защитить?

> Просто не надо
> питать иллюзий, что можно создать коробочную версию системы,
>  чтобы, типа, при установке она спросила: «На Вашем ПК обнаружены
> следующие 3 СУБД: …  Какую из них выбрать?».
>

Вот именно такие аргументы я и «записываю». Тем более если эти аргументы высказаны в подобной дискуссии.


 
Petr V. Abramov ©
 
(2008-08-27 02:11)
[31]

Удалено модератором


 
Германн ©
 
(2008-08-27 02:19)
[32]

Удалено модератором


 
Курдль
 
(2008-08-27 12:39)
[33]


> Германн ©   (27.08.08 01:33) [30]
> Вот именно такие аргументы я и «записываю». Тем более если
> эти аргументы высказаны в подобной дискуссии.

Тут Вам посоветовать ничего нельзя, не зная, что за приложение Вы разрабатываете.
А вдруг какй-нибудь OLAP-продвинутый построитель отчетов? Тогда может и надо его под разные базы затачивать. Или, тем более, — среду ETL. Так ей сам Бог велел!..


 
Германн ©
 
(2008-08-28 01:42)
[34]


> Курдль   (27.08.08 12:39) [33]
>
>
> > Германн ©   (27.08.08 01:33) [30]
> > Вот именно такие аргументы я и «записываю». Тем более
> если
> > эти аргументы высказаны в подобной дискуссии.
>
>
> Тут Вам посоветовать ничего нельзя, не зная, что за приложение
> Вы разрабатываете.
> А вдруг какй-нибудь OLAP-продвинутый построитель отчетов?
>  Тогда может и надо его под разные базы затачивать. Или,
>  тем более, — среду ETL. Так ей сам Бог велел!..
>

Я в последнее время ничего сам не разрабатываю. Ну в отношении программ для РС. Но я записываю подобные аргументы для представления их тем, кто хочет создать ПО, которое записывает в БД данные (и показывает их), причем «независимо» от провайдера и типа БД.


 
Игорь Шевченко ©
 
(2008-09-05 11:06)
[35]


> Возможно ли в триггере организовать цикл по полям таблицы?

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:59412348055


Program with PL/SQL в Екатеринбурге

Этот курс Oracle Database: Program with PL/SQL Ed 2 начинается с введения в PL/SQL, затем позволит вам оценить преимущества PL/SQL как мощного языка программирования. Прослушав лекции и выполнив практические занятия с инструкторами-разработчиками программных продуктов на технологиях Oracle, вы научитесь разрабатывать хранимые процедуры, функции, пакеты и многое другое.

Вы научитесь

  • Условному управлению потоком исполнения кода (циклы, структуры управления).

  • Созданию хранимых процедур и функций.

  • Использованию пакетов PL/SQL для группировки и хранения связанных конструкций.

  • Создание триггеров для решения бизнес-задач. Использование стандартных пакетов PL/SQL, поставляемых Oracle, для автоматизации повседневных задач

  • Ввод-вывод, файловый ввод-вывод.

  • Создание пользовательских пакетов для приложений.

  • Написание динамического SQL-код для приложений.

Использование Oracle SQL Developer


Для разработки этих программных модулей будет использоваться Oracle SQL Developer. Утилита SQL*Plus представлена в этом курсе в качестве дополнительного инструмента. Важное замечание: этот курс представляет собой комбинацию из курсов Oracle Database: PL/SQL Fundamentals и Oracle Database: Develop PL / SQL Program Units.

Стоимость курса

140 000 руб

Заказать

Вы научитесь:

Изучить:

  • Управление зависимостями между подпрограммами на PL/SQL.
  • Использование конструкций программирования на PL/SQL и условное управление потоком исполнения кода (циклы, структуры управления и явные курсоры).
  • Создание хранимых процедур и функций.
  • Использование условной компиляции для настройки функциональности приложения на PL/SQL без удаления исходного кода.
  • Использование поставляемых Oracle пакетов PL/SQL для создания вывода на экран, ввода-вывода файлов и вывода почты. Автоматизация повседневных задач.
  • Написание динамического SQL для большей гибкости программных единиц.
  • Создание перегруженных подпрограмм пакета для большей гибкости.
  • Создание триггеров для решения бизнес-задач.
  • Создание и отладка хранимых процедур и функций.
  • Описание особенностей и синтаксиса PL/SQL.
  • Разработка анонимных блоков PL/SQL, которые могут эффективно выполняться.
  • Разработка пакетов PL/SQL для группировки связанных конструкций.
  • Обработка ошибок времени выполнения
  • Аудитория:

    • разработчики приложений

    • администраторы базы данных

    • разработчики

    • разработчики форм

    • разработчики PL/SQL

    • разработчики порталов

    • системные аналитики

    • технические консультанты

    Требования к предварительной подготовке слушателя:

    курс Oracle Database 12c R2: Introduction to SQL

    курс Oracle Database 12c R2: SQL Workshop I

    курс Oracle Database 12c R2: SQL Workshop II

    Введение

    Цель курса. Программа курса. Описание демонстрационной схемы — схемы управления персоналом. Среды разработки PL/SQL, доступные в этом курсе. Введение в SQL Developer.

    Работа с облачным сервисом Oracle Cloud Exadata Express

    Введение в Oracle Database Exadata Express Cloud Service. Доступ к облачной базе данных с помощью SQL Workshop. Подключение к Exadata Express с помощью клиентов базы данных.

    Введение в PL/SQL

    Обзор PL/SQL. Определение преимуществ подпрограмм PL/SQL. Обзор типов блоков PL/SQL. Создание простого анонимного блока. Как генерировать вывод из блока PL / SQL?

    Объявление переменных PL/SQL

    Перечисление различных типов идентификаторов в подпрограмме PL/SQL. Использование раздела деклараций для определения идентификаторов. Использование переменных для хранения данных. Определение скалярных типов данных. Атрибут type. Что такое bind-переменные? оследовательности в выражениях на PL/SQL.

    Запись анонимных блоков PL / SQL

    Описание основных принципов синтаксиса блоков PL/SQL. Как комментировать код? Развертывание функций SQL в PL/SQL. Как конвертировать типы данных? Опишите вложенных блоков. Определение операторов в PL/SQL.

    Операторы SQL в блоке PL/SQL

    Вызов инструкции SELECT в PL/SQL. Получение данных в PL/SQL. Концепция курсора SQL. Избегайте ошибок с помощью соглашений об именовании объектов при использовании инструкций Retrieval и DML. Обработка данных на сервере с помощью PL/SQL. Объяснение концепции курсора SQL. Использование атрибутов курсора SQL для получения обратной связи по DML. Сохранение и удаление транзакций.

    Управляющие структуры

    Условная обработка с использованием операторов IF. Условная обработка с использованием операторов CASE. Описание простого оператора цикла. Описание оператора цикла While. Описание оператора цикла. Использование оператора continue.

    Составные типы данных

    Использование типа запись в PL/SQL. Атрибут %ROWTYPE. Вставка и обновление записей PL/SQL. Индекс по таблицам. Изучение индексов табличными методами. Использование индекса по таблице записей.

    Явные курсоры

    Что такое явные курсоры? Объявление курсора. Открытие курсора. Извлечение данных из курсора. Закрытие курсора. Курсор в цикле. Атрибуты %NOTFOUND и %ROWCOUNT. Описание предложений FOR UPDATE и WHERE CURRENT.

    Обработка исключений

    Понимание понятия исключения. Обработка исключений с помощью PL/SQL. Захват предопределенных ошибок сервера Oracle. Захват не предопределенных ошибок Сервера Oracle. Захват пользовательских исключений. Распространение исключений. Процедура RAISE_APPLICATION_ERROR.

    Хранимые процедуры

    Создание модульного и многоуровневого дизайна подпрограмм. Модульная разработка с блоками PL/SQL. Понимание среды выполнения PL/SQL. Перечисление преимуществ использования подпрограмм PL/SQL. Перечисление различий между анонимными блоками и подпрограммами. Создание, вызов и удаление хранимых процедур. Создание процедур с параметрами и режимы параметров. Просмотр сведений о процедуре.

    Хранимые функции

    Создание, вызов и удаление хранимых функций. Определение преимуществ использования хранимых функций. Определение шагов для создания сохраненной функции. Вызов пользовательских функций в инструкциях SQL. Ограничения при вызове функций. Контроль побочных эффектов при вызове функций. Просмотр информации о функциях.

    Отладка подпрограмм

    Как отлаживать функции и процедуры? Отладка через SQL Developer.

    Пакеты

    Перечисление преимуществ пакетов. Описание пакетов. Каковы компоненты пакета? Как разработать пакет. Как включить видимость компонентов пакетов? Создание спецификации и тела пакета с помощью инструкции SQL CREATE и SQL Developer. Вызов конструкций пакета. Просмотр исходного кода PL/SQL с помощью словаря данных.

    Развертывание пакетов

    Перегрузка подпрограмм в PL/SQL. Использование стандартных пакетов. Использование прямых объявлений для разрешения неразрешенной ссылки на процедуру. Реализация функций пакета в SQL и ограничения. Постоянное состояние пакетов. Постоянное состояние курсора в пакете. Контроль побочных эффектов подпрограмм на PL/SQL. Вызов из PL/SQL таблиц записей в пакетах.

    Реализация пакетов Oracle при разработке приложений

    Какие пакеты поставляются Oracle? Примеры некоторых пакетов, поставляемых Oracle. Как работает пакет DBMS_OUTPUT? Использование пакета UTL_FILE для взаимодействия с файлами операционной системы. Вызов пакета UTL_MAIL. Написание своих подпрограммы с использованием UTL_MAIL.

    Динамический SQL

    Поток выполнения SQL. Что такое динамический SQL? Как объявить переменную курсора. Динамическое выполнение блока PL/SQL. Настройка собственного динамического SQL для компиляции кода PL/SQL. Как вызвать пакет DBMS_SQL? Реализуйте DBMS_SQL с параметризованным оператором DML. Функциональная полнота динамического SQL.

    Рекомендации по разработке кода PL/SQL

    Стандартизация констант и исключений. Понимание локальных подпрограмм. Запись автономных транзакций. Как реализовать hint (подсказку) компилятору nocopy. Вызов подсказки PARALLEL_ENABLE. Кэш результатов функции PL/SQL между сессиями. Детерминированное выполнение операторов языка с вызовом функций. Использование массового связывания для повышения производительности.

    Триггеры

    Описание триггеров. Определение типов событий срабатывания триггера и тело триггера. Сценарии бизнес-приложений для реализации триггеров. Создание триггеров DML с помощью инструкции CREATE TRIGGER и SQL Developer. Определите типов событий срабатывания триггера, тело триггера и время срабатывания. Различия между триггерами уровня оператора и триггерами уровня строки. Создание триггеров Instead of и инструкция Disabled. Как управлять, тестировать и удалять триггеры?

    Создание триггеров базы данных типа Compound, DDL и Event

    Что такое составные триггеры? Определение разделов временной точки составного триггера таблицы. Понимание структуры составного триггера для таблиц и представлений. Реализуйте составной триггер для устранения ошибки мутации данных в таблице. Сравнение триггеров базы данных с хранимыми процедурами. Создание триггеров для операторов DDL. Создание триггеров событий базы данных и системных событий. Системные привилегии, необходимые для управления триггерами.


    Компилятор PL/SQL


    Что такое компилятор PL/SQL? Описание параметров инициализации для компиляции PL/SQL. Перечисление новых предупреждений времени компиляции PL/SQL. Обзор предупреждений времени компиляции PL/SQL для подпрограмм. Перечисление преимуществ предупреждений компилятора. Перечисление категорий предупреждений о времени компиляции PL/SQL. Установка уровней предупреждений: с помощью SQL Developer, параметра инициализации PLSQL_WARNINGS и подпрограмм пакета DBMS_WARNING. Просмотр предупреждений компилятора: использование представлений SQL Developer, SQL*Plus или словаря данных.

    Управление зависимостями

    Обзор зависимостей объектов схемы. Запрос прямых зависимостей объектов с помощью представления USER_DEPENDENCIES. Запрос состояния объектов. Недействительность зависимых объектов. Отображение прямых и косвенных зависимостей. Управление зависимостями на уровне единичных элементов кода в базе данных Oracle 12c. Понимание того, что такое удаленная зависимость. Перекомпиляция программного модуля PL/SQL.

    Учебное пособие по PL/SQL — Итеративные операторы

    Операторы итеративного управления используются, когда мы хотим повторить выполнение одного или нескольких операторов определенное количество раз.

    В PL/SQL существует три типа циклов:

    • Простой цикл
    • Цикл while
    • Цикл For

    1) Простой цикл

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

    Общий синтаксис для написания простого цикла:

    :

     LOOP 
     операторов; 
     ВЫХОД; 
     {или условие ВЫХОД КОГДА;} 
     КОНЕЦ ЦИКЛА; 

    Это важные шаги, которые необходимо выполнить при использовании Simple Loop.

    1) Инициализировать переменную перед телом цикла.
    2) Увеличить переменную в цикле.
    3) Используйте оператор EXIT WHEN для выхода из цикла. Если вы используете оператор EXIT без условия WHEN, операторы в цикле выполняются только один раз.

    2) Цикл While

    ЦИКЛ WHILE используется, когда набор операторов должен выполняться до тех пор, пока выполняется условие. Условие оценивается в начале каждой итерации. Итерация продолжается до тех пор, пока условие не станет ложным.

    Общий синтаксис для написания WHILE LOOP:

     WHILE <условие> 
     операторы LOOP; 
     КОНЦЕВАЯ ПЕТЛЯ; 

    Важные шаги, которые необходимо выполнить при выполнении цикла while:

    1) Инициализировать переменную перед телом цикла.
    2) Увеличить переменную в цикле.
    3) Оператор EXIT WHEN и оператор EXIT могут использоваться в циклах while, но это делается нечасто.

    3) Цикл FOR

    ЦИКЛ FOR используется для выполнения набора операторов заданное количество раз. Итерация происходит между заданными начальным и конечным целочисленными значениями. Счетчик всегда увеличивается на 1. Цикл завершается, когда счетчик достигает значения конечного целого числа.

    Общий синтаксис для записи FOR LOOP:

     FOR counter IN val1..val2 
     операторы LOOP; 
     КОНЦЕВАЯ ПЕТЛЯ; 
    • val1 — начальное целочисленное значение.
    • знач.2 — конечное целочисленное значение.

    Важные шаги, которые необходимо выполнить при выполнении цикла while:

    1) Переменная счетчика неявно объявлена ​​в разделе объявлений, поэтому нет необходимости объявлять ее явно.
    2) Переменная счетчика увеличивается на 1, и ее не нужно увеличивать явно.
    3) Оператор EXIT WHEN и оператор EXIT могут использоваться в циклах FOR, но это делается нечасто.

    ПРИМЕЧАНИЕ: Циклы выше объясняются на примере при работе с явными курсорами.

    PL SQL Объективные вопросы 1, Лучший PL SQL Объективные вопросы 1, Курс, Классы, Учебный институт

    Как называется курсор, написанный и поддерживаемый пользователем базы данных?

    1. Пользовательский курсор
    2. Явный курсор
    3. Неявный курсор
    4. Пользовательский курсор

    Ответ : 2


    Каков синтаксис неявного атрибута курсора ISOPEN?

    1. %ISOPEN
    2. #ИЗОПЕН
    3. &ISOPEN
    4. ! ИЗОПЕН

    Ответ : 1


    На что указывает атрибут %FOUND?

    1. Указывает, что курсор найден.
    2. Указывает количество затронутых строк.
    3. Указывает, были ли затронуты какие-либо строки.
    4. Указывает, не были ли затронуты какие-либо строки.

    Ответ : 3


    Когда используется неявный курсор?

    1. Оператор SELECT или DML запущен и не связан ни с одной переменной курсора.
    2. Оператор SELECT выполняется, даже если операторы связаны с явным курсором.
    3. Оператор DDL запущен, и операторы не связаны с каким-либо явным курсором.
    4. Выполняется инструкция SELECT/DML, и инструкции не связаны с явным курсором.

    Ответ : 4


    К какому типу курсора относится неявный и явный курсор?

    1. Системный курсор
    2. Курсор сеанса
    3. Курсор базы данных
    4. Курсор операционной системы

    ANS : 2


    Посещение бесплатной демонстрации и изучение

    SQL Server Online Training Экспертом в реальном времени


    Какая из операций проверки курсора для обоснованности заявления SQL?

    1. ОТКРЫТЬ
    2. СВЯЗАТЬ
    3. ПОЛУЧИТЬ
    4. РАЗБОР

    Ответ : 4


    Сколько строк может содержать курсор?

    1. Только один
    2. Только ноль
    3. Один или несколько
    4. От одного до десяти

    Ответ : 3


    Что из нижеперечисленного неверно относительно курсора?

    1. Курсор является именованной частной областью SQL
    2. Курсор содержит временные результаты
    3. Курсор используется для получения нескольких строк
    4. SQL использует неявные курсоры для извлечения строк

    Ответ : 3


    Найдите НЕЧЕТНОЕ из следующих

    1. ОТКРЫТЬ
    2. ЗАКРЫТЬ
    3. ВСТАВКА
    4. ПОЛУЧИТЬ

    Ответ : 3


    Что оператор COMMIT делает с CURSOR?

    1. Открыть курсор
    2. Получить курсор
    3. Закрыть курсор
    4. Ничего из вышеперечисленного

    Ответ : 4


    Посетите бесплатную демонстрацию и изучите   

    ОНЛАЙН-ТРЕНИНГ ПО SQL SERVER    экспертом Real-Time Expert


    Какое из следующих утверждений о неявных курсорах верно?

    1. Неявные курсоры используются для безымянных операторов SQL.
    2. Разработчики должны использовать неявные курсоры с большой осторожностью.
    3. Неявные курсоры используются в циклах курсора для обработки данных.
    4. Неявные курсоры больше не являются функцией Oracle.

    Ответ : 1


    Что из следующего не является особенностью цикла FOR курсора?

    1. Объявление типа записи.
    2. Открытие и разбор операторов SQL.
    3. Извлекает записи из курсора.
    4. Требуется определить условие выхода.

    Ответ : 2


    Когда следует использовать оператор CLOSE в PL/SQL?

    1. Как для неявных, так и для явных курсоров
    2. Только для явных курсоров
    3. Только для неявных курсоров
    4. Только для выражения курсора

    Ответ : 2


    Каким может быть значение предложения INTO при выборке данных в явном курсоре?

    1. Только скалярные переменные PL/SQL
    2. Переменные PL/SQL или записи
    3. Только коллекции или записи
    4. Только записи

    Ans : 2


    Какое из ложных утверждений об открытии и закрытии явного курсора?

    1. Явный курсор закрывается оператором CLOSE.
    2. Закрытый курсор нельзя снова открыть.
    3. Оператор Open идентифицирует результирующий набор и позиционирует курсор перед первой строкой
    4. Опционально аргументы могут быть переданы оператору open для открытия курсора

    Ответ : 2


    Каков тип данных возвращаемого значения атрибута SQL%ROWCOUNT?

    1. ЦЕЛОЕ ЧИСЛО
    2. НОМЕР
    3. PLS_INTEGER
    4. логическое значение

    Ответ : 3


    Посетите бесплатную демонстрацию и узнайте   

    ОНЛАЙН-ОБУЧЕНИЕ SQL SERVER    от Real-Time Expert


    Когда столбец, выбранный в явном курсоре, должен иметь псевдоним ?

    1. Никогда не следует использовать псевдоним
    2. Всегда следует использовать псевдоним для столбцов в явном курсоре
    3. Запрос включает виртуальный столбец или выражение, на которое есть ссылка в запросе
    4. Курсор используется для выборки в запись, которая была объявлена ​​с помощью %ROWTYPE

    Ответ : 3


    Какое из следующих утверждений об объявлении и определении курсора верно?

    1. Явный курсор должен быть объявлен и определен одновременно в блоке выполнения.
    2. Явный курсор может быть сначала объявлен, а затем определен позже
    3. : Явный курсор должен быть объявлен и определен одновременно в блоке объявлений.
    4. Объявление и определение курсора совпадают и представляют собой один шаг

    Ответ : 2


    Каково значение %ROWCOUNT   до того, как будет выбрана первая строка?

    1. 1
    2. Ноль
    3. -1
    4. НУЛЕВОЙ

    Ответ : 2


    Какой атрибут SQL можно использовать для определения условия выхода из цикла ?

    1. %FOUND
    2. %ISOPEN
    3. %ROWCUNT
    4. % НЕ НАЙДЕНО

    Ответ : 4


    Какова область действия индекса CURSOR FOR LOOP?

    1. Локальный к кольцу
    2. Глобальный
    3. Локальный по отношению к циклу и окружающим циклам
    4. Область блока (во всем блоке Pl/SQL)

    Ответ :  1


    Посетите бесплатную демонстрацию и изучите   

    ОНЛАЙН-ОБУЧЕНИЕ ПО SQL SERVER    проводится экспертом в реальном времени


    Почему используется WHERE CURRENT OF CLAUSE в курсорах?

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