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 -
разработчики порталов -
системные аналитики -
технические консультанты
Требования к предварительной подготовке слушателя:
курс 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 существует три типа циклов: • Простой цикл 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, Курс, Классы, Учебный институт
Как называется курсор, написанный и поддерживаемый пользователем базы данных?
- Пользовательский курсор
- Явный курсор
- Неявный курсор
- Пользовательский курсор
Ответ : 2
Каков синтаксис неявного атрибута курсора ISOPEN?
- %ISOPEN
- #ИЗОПЕН
- &ISOPEN
- ! ИЗОПЕН
Ответ : 1
На что указывает атрибут %FOUND?
- Указывает, что курсор найден.
- Указывает количество затронутых строк.
- Указывает, были ли затронуты какие-либо строки.
- Указывает, не были ли затронуты какие-либо строки.
Ответ : 3
Когда используется неявный курсор?
- Оператор SELECT или DML запущен и не связан ни с одной переменной курсора.
- Оператор SELECT выполняется, даже если операторы связаны с явным курсором.
- Оператор DDL запущен, и операторы не связаны с каким-либо явным курсором.
- Выполняется инструкция SELECT/DML, и инструкции не связаны с явным курсором.
Ответ : 4
К какому типу курсора относится неявный и явный курсор?
- Системный курсор
- Курсор сеанса
- Курсор базы данных
- Курсор операционной системы
ANS : 2
Посещение бесплатной демонстрации и изучение
SQL Server Online Training Экспертом в реальном времени
Какая из операций проверки курсора для обоснованности заявления SQL?
- ОТКРЫТЬ
- СВЯЗАТЬ
- ПОЛУЧИТЬ
- РАЗБОР
Ответ : 4
Сколько строк может содержать курсор?
- Только один
- Только ноль
- Один или несколько
- От одного до десяти
Ответ : 3
Что из нижеперечисленного неверно относительно курсора?
- Курсор является именованной частной областью SQL
- Курсор содержит временные результаты
- Курсор используется для получения нескольких строк
- SQL использует неявные курсоры для извлечения строк
Ответ : 3
Найдите НЕЧЕТНОЕ из следующих
- ОТКРЫТЬ
- ЗАКРЫТЬ
- ВСТАВКА
- ПОЛУЧИТЬ
Ответ : 3
Что оператор COMMIT делает с CURSOR?
- Открыть курсор
- Получить курсор
- Закрыть курсор
- Ничего из вышеперечисленного
Ответ : 4
Посетите бесплатную демонстрацию и изучите
ОНЛАЙН-ТРЕНИНГ ПО SQL SERVER экспертом Real-Time Expert
Какое из следующих утверждений о неявных курсорах верно?
- Неявные курсоры используются для безымянных операторов SQL.
- Разработчики должны использовать неявные курсоры с большой осторожностью.
- Неявные курсоры используются в циклах курсора для обработки данных.
- Неявные курсоры больше не являются функцией Oracle.
Ответ : 1
Что из следующего не является особенностью цикла FOR курсора?
- Объявление типа записи.
- Открытие и разбор операторов SQL.
- Извлекает записи из курсора.
- Требуется определить условие выхода.
Ответ : 2
Когда следует использовать оператор CLOSE в PL/SQL?
- Как для неявных, так и для явных курсоров
- Только для явных курсоров
- Только для неявных курсоров
- Только для выражения курсора
Ответ : 2
Каким может быть значение предложения INTO при выборке данных в явном курсоре?
- Только скалярные переменные PL/SQL
- Переменные PL/SQL или записи
- Только коллекции или записи
- Только записи
Ans : 2
Какое из ложных утверждений об открытии и закрытии явного курсора?
- Явный курсор закрывается оператором CLOSE.
- Закрытый курсор нельзя снова открыть.
- Оператор Open идентифицирует результирующий набор и позиционирует курсор перед первой строкой
- Опционально аргументы могут быть переданы оператору open для открытия курсора
Ответ : 2
Каков тип данных возвращаемого значения атрибута SQL%ROWCOUNT?
- ЦЕЛОЕ ЧИСЛО
- НОМЕР
- PLS_INTEGER
- логическое значение
Ответ : 3
Посетите бесплатную демонстрацию и узнайте
ОНЛАЙН-ОБУЧЕНИЕ SQL SERVER от Real-Time Expert
Когда столбец, выбранный в явном курсоре, должен иметь псевдоним ?
- Никогда не следует использовать псевдоним
- Всегда следует использовать псевдоним для столбцов в явном курсоре
- Запрос включает виртуальный столбец или выражение, на которое есть ссылка в запросе
- Курсор используется для выборки в запись, которая была объявлена с помощью %ROWTYPE
Ответ : 3
Какое из следующих утверждений об объявлении и определении курсора верно?
- Явный курсор должен быть объявлен и определен одновременно в блоке выполнения.
- Явный курсор может быть сначала объявлен, а затем определен позже
- : Явный курсор должен быть объявлен и определен одновременно в блоке объявлений.
- Объявление и определение курсора совпадают и представляют собой один шаг
Ответ : 2
Каково значение %ROWCOUNT до того, как будет выбрана первая строка?
- 1
- Ноль
- -1
- НУЛЕВОЙ
Ответ : 2
Какой атрибут SQL можно использовать для определения условия выхода из цикла ?
- %FOUND
- %ISOPEN
- %ROWCUNT
- % НЕ НАЙДЕНО
Ответ : 4
Какова область действия индекса CURSOR FOR LOOP?
- Локальный к кольцу
- Глобальный
- Локальный по отношению к циклу и окружающим циклам
- Область блока (во всем блоке Pl/SQL)
Ответ : 1
Посетите бесплатную демонстрацию и изучите
ОНЛАЙН-ОБУЧЕНИЕ ПО SQL SERVER проводится экспертом в реальном времени
Почему используется WHERE CURRENT OF CLAUSE в курсорах?
- Пользователь может легко вносить изменения в строку данных, которая была извлечена последней.