Delphi Notes
Если Вы всерьёз решили заниматься освоением СУБД Oracle, то в первую очередь я Вам посоветую найти книгу Oracle для профессионалов. Книга 1. Архитектура и основные особенности. Том Кайт. (Есть ещё Книга 2, тоже полезно.) А если Вы пока не понимаете, нужно ли оно Вам, то можно просто попробовать поработать с этой СУБД, на самые ключевые особенности СУБД я постараюсь обратить внимание в этой заметке.
HINT: Если Вы вообще ни разу не работали с базами данных, то лучше сначала ознакомиться с теорией реляционных баз данных и попробовать сделать, например ежедневник, или телефонный справочник на MS Access (да-да, в академических целях лучше использовать наипростейший инструмент! ну и найти какую-нибудь книгу типа Введение в базы данных – по ссылке Вы найдёте кусочек текста). Ну или, если Вы без Delphi совсем жить не можете, то можно это сделать с использованием того же BDE и Paradox; у меня была книга “Программирование баз данных в Delphi 7. Валерий Фаронов”.
Однако замечу, что с наскока, без знания теории, сделать что-то дельное сразу не получится, поэтому лучше помучить Access – это единая программа, где можно и проектировать структуру БД, и “рисовать” формочки и, не зная SQL, “рисовать” запросы к БД и получать отчёты.
Ну ещё порекламирую книгу Delphi. Профессиональное программирование.
Дмитрий Осипов., часть II которой посвящена базам данных (там тоже есть теория).
HINT: Если Вы не знаете, какую СУБД выбрать, то дам такой совет. Во-первых, надо исходить из специфики конкретной задачи, Oracle – это конечно здорово, но есть и другие СУБД. Во-вторых продублирую пару ссылок из предыдущей заметки: Oracle vs MSSQL2k и Oracle 10g vs SQL Server 2005. Ну и в-третьих, нужно знать специфику СУБД, чтобы под эту СУБД разрабатывать клиентские приложения; если Вы выбираете серьёзную СУБД типа Oracle, то надо быть готовым к тому, что в будущем миграция на другую СУБД может оказаться крайне затруднительной (см. пункт 7).
Итак, ключевые особенности СУБД Oracle
1. Пользователь БД = Схема БД
01# — SQL e PL/SQL ORACLE — Estrutura básica de uma query select
Эту особенность можно критиковать, однако в Oracle оно вот так сложилось исторически. Пользователь БД не может существовать без схемы БД, и наоборот: схема БД привязана к конкретному пользователю. Создавая пользователя БД (create user ), в БД автоматически создастся схема . При попытке удалить пользователя (drop user), произойдёт попытка удалить и его схему.
В предыдущей заметке меня спросили: “Мы подключились как scott — мы теперь видим его таблицы или все таблицы? И как увидеть тогда чужие. ”.
Да, подключаясь под пользователем scott, мы по умолчанию попадаем в схему scott и видим все объекты этой схемы. Чтобы можно было обратиться к объекту чужой схемы, можно пойти разными путями.
а). Перед именем объекта явно указывать имя схемы, например:
select * from scott.emp
б). Воспользоваться синонимами и создать так называемый public synonym:
Aula 04 — Primeiros Passos no PL/SQL
create public synonym emp for scott.emp
Ключевое слово public говорит о том, что этот синоним будет доступен из любой схемы. И тогда из чужой схемы можно будет писать:
select * from emp
Тут Oracle увидит, что синоним emp ссылается на scott.emp и запрос будет почти эквивалентен запросу из пункта а). “Почти” – потому что есть приоритеты поиска объектов: Oracle сначала попробует найти объект emp в текущей схеме, а если не получится, то только тогда будет использован синоним.
в). Можно просто взять и переключиться в другую схему:
alter session set current_schema =
Сделать это можно, например, в триггере на подключение к БД. Кстати этот вариант (по отношению к варианту б) Том Кайт называет как “меньшее из двух зол” (Synonyms vs Alter session current_schema).
г). Реализовать свой способ хранения и авторизации пользователей. Т.е. я имею ввиду следующее: сначала происходит Oracle авторизация (все пользователи ходят в БД под одним именем и паролем, сразу попадая в нужную схему), а потом уже делать дополнительную свою проверку: пользователь вводит логин/пароль и тут мы уже сами смотрим, есть ли такой пользователь в нашей схеме, или нет.
Последний пункт может показаться диким, однако в бесплатной редакции Oracle есть ограничение на количество пользователей (схем), и там такой вариант кажется очень даже уместным.
Лично мне довелось опробовать первые три пункта, а четвёртый у нас стоит на повестке дня. Могу сказать, что везде есть свои плюсы и минусы. Однако для начала, всё же, лучше пользоваться либо пунктом а), либо вообще об этом пока не думать и “ходить” в БД под одним пользователем. В предыдущих и последующих заметках я не буду явно ссылаться на какую-либо схему в запросах.
Ради спортивного интереса Вы можете выполнить такие запросы:
select * from all_tables where owner = ‘SCOTT’ select * from all_users select * from all_objects
2. Пару слов о транзакциях
а). В Oracle нет необходимости объявлять начало транзакции каким-бы то ни было способом явно. Другими словами, если Вы выполняете insert, update или delete, то транзакция начинается автоматически. Ну и не забываем, что транзакция заканчивается либо командой commit (зафиксировать транзакцию) либо rollback (откатить транзакцию).
Есть ещё возможность выполнять команды с автокоммитом (т.е. commit выполнится автоматически, если операция выполнилась успешно).
Кстати, если во время выполнения транзакции произошла ошибка, то Oracle автоматически выполнит откат (rollback). Это нам позволит в Delphi-коде вместо чего-то такого:
StartTransaction; try DoSomething; CommitTransaction; except RollbackTransaction; raise; end;
DoSomething; CommitTransaction;
б). Если в некоторых других СУБД Вы в пределах текущей сессии можете создавать несколько параллельно выполняющихся транзакций, то в Oracle такого делать нельзя: в пределах сессии существует лишь одна транзакция.
Эта особенность (как мне думается, я могу ошибаться) вытекает как следствие из пункта а). Однако Вам ничто не мешает создать ещё одну сессию параллельно, тем самым сымитировав одновременное выполнение нескольких транзакций.
в). Oracle поддерживает Автономные транзакции.
г). В Oracle существуют точки сохранений (savepoint). Кое-что я о них уже писал ранее: здесь и здесь.
3. Последовательности (сиквенсы)
В Oracle отсутствует понятие автоинкрементного поля, использующегося в некоторых СУБД для создания суррогатного ключа. Вместо этого, Oracle предлагает использовать последовательности (sequence). Последовательность – это именованный объект БД, обладает довольно простым набором свойств: текущее значение (число, атрибут currval), следующее значение (число, атрибут nextval), начальное значение (число, обычно оно равно 1), максимальное значение (тоже число, обычно оооочень большое), инкремент (число, обычно равно 1, может быть отрицательным) и признак — возможность сброса последовательности в начальное значение, при достижении текущего значения максимума. На практике последовательности используют примерно так:
insert into my_table(id, field1, field2) values (my_sequence.nextval, value1, value2);
Здесь my_sequence – это и есть последовательность, nextval — атрибут, возвращающий очередное значение последовательности.
У последовательностей есть парочка особенностей:
а). Последовательности “живут” как бы вне транзакций. Т.е. если у последовательности запросить nextval, это приведёт к изменению текущего значения последовательности, и если затем сделать откат транзакции, то текущее значение последовательности уже не будет восстановлено. Ну или другими словами: если две сессии выполняют длительные транзакции и обращаются к одной и той же последовательности, то:
- во-первых, не будет никаких блокировок (из-за пользования общим ресурсом) и сессии будут выполняться параллельно;
- во-вторых, обе сессии получат разные значения nextval.
Вобщем, использование последовательностей гарантирует получение уникального значения для использования его в качестве суррогатного ключа. При этом, Вас никто не ограничивает использовать отдельные последовательности на разные таблицы, т.е. Вы можете использовать одну последовательность сразу для нескольких таблиц.
б). Надо помнить, что в DML операциях N обращений к nextval на уровне одной записи таблицы приведёт всего лишь к 1 изменению последовательности. При этом currval вернёт такое же значение. Наглядный пример:
create sequence my_sequence; —sequence MY_SEQUENCE created. create table my_table(id1 integer, id2 integer, id3 integer, id4 integer); —table MY_TABLE created. insert into my_table(id1, id2, id3, id4) values (my_sequence.currval, my_sequence.nextval, my_sequence.currval, my_sequence.nextval); —1 rows inserted. insert into my_table(id1, id2, id3, id4) values (my_sequence.currval, my_sequence.nextval, my_sequence.currval, my_sequence.nextval); —1 rows inserted. insert into my_table(id1, id2, id3, id4) values (my_sequence.currval, my_sequence.nextval, my_sequence.currval, my_sequence.nextval); —1 rows inserted. select * from my_table;
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 |
| 3 | 3 | 3 | 3 |
4. Пустая строка и NULL
Некоторые СУБД различают пустую строку (») и NULL как разные значения. Для Oracle же пустая строка эквивалента NULL-значению. Это означает, что любое сравнение с пустой строкой вернёт FALSE, например такой запрос:
select * from all_tables where owner <> »
не вернёт ни одной записи. Правильно писать так:
select * from all_tables where owner is not null
В общем надо владеть понятием троичная логика и помнить, что пустое значение интерпретируется как NULL. А в тех случаях, когда значение переменной или столбца заранее не известно, использовать такие функции как nvl, nvl2, coalesce.
5. Временные таблицы
Об этом много подробно написано, например здесь (подробно) или здесь (кратко). Вообще название “временная” не обязует СУБД создавать эту таблицу в пределах сессии на лету. Тут имеется ввиду временность данных, хранящихся в этой таблице: данные временной таблицы доступны только лишь в пределах текущей сессии; эти данные нельзя “подсмотреть” из другой сессии.
Это позволяет реализовывать разные задачи. Например, в интерфейсе приложения пользователь выбирает несколько критериев поиска данных: пусть это будет нестрогий (т.е. с использованием символов “*” и “?”) список наименований, которые он хочет найти. Приложение сохраняет эти критерии во временную таблицу как несколько строк (с заменой “*” на “%” и “?” на “_”), и далее делаем select-запрос по искомой таблице с соединением её с временной таблицей через like (вместо применений нескольких условий like через or в предложении where запроса).
6. Аналитические функции в SQL
Аналитические функции – это очень мощный инструмент-расширение стандарта SQL. Строго говоря, можно обойтись и без использования аналитических функций, но тогда запросы будут: а) громоздкими, б) долго выполнимыми. Почитать тут.
Правда на практике я несколько раз сталкивался с тем, что вместо аналитических функций (в целях производительности) лучше использовать pipelined-функции на PL/SQL.
7. PL/SQL – процедурное расширения языка SQL
Почитать (ссылка). PL/SQL используется для написания триггеров, процедур, функций и пакетов – всё это нужно для реализации бизнес логики приложений на стороне БД. Другими словами, PL/SQL позволяет максимально отгородить программный код, управляющий данными, от Ваших приложений. Что в свою очередь облегчает написание последних, превращая их лишь в инструменты ввода/вывода данных.
Ну или скажу по другому: с появлением PL/SQL базы данных перестали быть “тупыми” хранилищами данных. Теперь БД может работать и обрабатывать данные даже без участия внешних приложений: см. пункт 8.
Пакеты PL/SQL – это что-то наподобие модулей (unit) в Delphi. У пакета обязательно есть описательная часть (create package – аналог секции interface в Delphi-модуле) и может существовать так называемое тело пакета (create package body – аналог секции implementation). Описательная часть содержит типы, переменные, константы и прототипы процедур и функций. Тело пакета тоже может содержать объявления типов, переменные, константы и содержит реализацию объявленных процедур и функций.
У PL/SQL пакетов есть одна неочевидная (на мой взгляд) особенность: значения глобальных и локальных переменных пакета существуют лишь только в пределах текущей сессии (наподобие временных таблиц). Т.е. если одна сессия сохранит какое-то значение в глобальную переменную пакета, то в другой сессии эта переменная пакета может иметь совсем другое значение.
Стоит так же заметить, что чем больше у Вас кода на PL/SQL, тем сложнее будет миграция на другую СУБД. Краем уха, мне довелось услышать об OpenSource СУБД PostgreSQL, в которой есть аналогичный PL/SQL язык, под названием PL/pgSQL.
8. Задания (job)
В Oracle есть планировщик заданий. Задание – это выполнение какой-либо процедуры по расписанию. Задание может быть разовым (однократным), либо периодическим. Почитать тут (ох уж этот интерфейс.ру).
9. Pipelined-функции
Это довольно интересная тема и, как и аналитические функции, заслуживает отдельного внимания. Почитать тут (документация oracle) и тут (на русском, кстати полезный ресурс).
Пожалуй, на этом и закончу
Конечно это ещё не всё. В Oracle есть ещё такие понятия, о которых бы стоило упомянуть отдельно: Nested Tables, Hint, Flashback Query. Есть ещё разные способы организации хранения таблиц (например в индексе). Есть и другие :с). Однако чем дальше, тем это менее важно на начальных этапах знакомства с этой СУБД.
Спасибо за внимание, жду комментариев.
Источник: www.delphinotes.ru
Процедурный язык запросов PL/SQL

Процедурный язык запросов PL/SQL – это процедурное расширение языка запросов SQL, разработанное фирмой Oracle. SQL является непроцедурным языком, т.к. пользователь просто отправляет на сервер базы данных команду SQL, а способ выполнения команды выбирает сам сервер. PL/SQL требует пошаговых инструкций для выполнения требуемых действий.
PL/SQL является языком третьего поколения, и имеет языковые элементы для объявления переменных, присвоения значений, проверки условий и ветвлений. Кроме того, он позволяет включать команды манипулирования данными (DML) и запросы в программные единицы, что позволяет контролировать выполнение транзакций с помощью PL/SQL.
PL/SQL блочно-ориентирован, это позволяет группировать логические единицы в блоки, каждый из которых может быть разбит на более мелкие подблоки. Сложная задача, таким образом, разбивается на отдельные легко управляемые модули, реализуемые в программной логике с помощью блоков.
PL/SQL позволяет описывать переменные простых и составных типов, константы, курсоры, исключения и использовать их в командах SQL и PL/SQL. Типы переменных могут быть описаны динамически, на основе типов данных столбцов таблицы базы данных. Типы данных PL/SQL и SQL совместимы и могут быть явно или неявно преобразованы друг в друга.
PL/SQL имеет управляющие структуры, позволяющие организовывать условное выполнение и цикличность обработки команд. Кроме того, PL/SQL имеет средства для обработки строк, возвращенных многострочным запросом SQL из базы данных.
PL/SQL имеет обработчик исключительных ситуаций (Exception Handler) для обработки ошибок и исключений, которые могут возникнуть во время выполнения кода PL/SQL. Таким образом могут быть обработаны, как ошибки сервера базы данных, так и исключения, определенные пользователем.
PL/SQL легко переносим, т.к. стандартизован для всех серверов фирмы Oracle, независимо от платформы. Программа, написанная на языке PL/SQL, может быть откомпилирована и выполнена на любом сервере Oracle без модификаций.
PL/SQL группирует команды SQL в единый блок и передает их серверу Oracle за одно обращение, снижая сетевой трафик.
Ядро PL/SQL
Программы, написанные на языке PL/SQL, обрабатываются ядром PL/SQL, которое может быть частью сервера Oracle или частью инструментального средства, в зависимости от того, как вызывается PL/SQL.
Если код PL/SQL запускается из SQL*Plus, oн обрабатывается ядром PL/SQL на сервере Oracle. Код сканируется, разбирается и компилируется. SQL, содержащийся в блоке, разделяется на отдельные команды, которые передаются Исполнителю команд SQL (SQL Statement Executor) на сервере Oracle. Набор данных, полученный в результате выполнения команды SQL, поступает в ядро PL/SQL для дальнейшей обработки. Процедурные выражения, не являющиеся командами SQL, передаются на выполнение Исполнителю процедурных команд (Procedure Statement Executor), который является частью ядра PL/SQL.
Одним из преимуществ использования блоков PL/SQL по сравнению с индивидуальным выполнением каждого оператора SQL является уменьшение загрузки сети, т.к. для передачи блока из приложения на сервер базы данных достаточно одной операции (Рисунок 1).

Рисунок 1 Выполнение блока PL/SQL и отдельных предложений SQL сервером Oracle
Блочная структура PL/SQL
Процедурный язык PL/SQL блочно-ориентирован. Каждая программная единица PL/SQL состоит из одного или более блоков, которые могут быть полностью независимыми или вложенными друг в друга. Основной блок кода PL/SQL может содержать до трех частей
DECLARE – декларативная необязательная секция
содержит объявление переменных, констант, курсоров, пользовательских исключений
BEGIN – обязательная секция выполняемого кода
содержит команды SQL для манипулирования данными в базе и команды PL/SQL для манипулирования данными в блоке
EXCEPTION – необязательная секция обработки исключений (ошибок или предупреждений)
определяет действия, связанные с обработкой ошибок сервера или пользовательских исключений, возникших в секции выполняемого кода
Основной блок кода PL/SQL может использоваться в различных программных конструкциях:
Неименованный блок PL/SQL, встроенный в приложение или выполняемый интерактивно (например, из SQL*Plus). Описывается в той точке приложения, где будет выполняться и передается на выполнение ядру PL/SQL во время выполнения приложения
Хранимая процедура или функция
Именованный блок PL/SQL, который позволяет задавать параметры и может выполняться многократно на стороне сервера
Процедура или функция приложения
Именованный блок PL/SQL, который позволяет задавать параметры и может выполняться многократно на стороне клиента
Именованный модуль PL/SQL, который группирует связанные процедуры, функции, идентификаторы
Триггер базы данных
Блок PL/SQL, связанный с таблицей базы данных и выполняемый автоматически
Блок PL/SQL, связанный с событием в приложении и выполняемый автоматически
Именованные блоки PL/SQL называются программными единицами. Программные единицы делятся на три категории:
§ Процедуры, позволяющие задавать параметры и выполняющие заданные действия
§ Функции, позволяющие задавать параметры, вычисляющие и возвращающие значения
§ Пакеты, объединяющие логически связанные процедуры и функции
Программные единицы подразделяются на хранимые и прикладные подпрограммы (подпрограммы приложения):
Хранимая подпрограмма
Прикладная подпрограмма
Из любого приложения или инструментального средства базы данных
Только из данного приложения
Подпрограмма может содержать до четырех секций:
§ Обязательная секция заголовка – определяет имя, тип и аргументы подпрограммы
§ Декларативная необязательная секция – содержит объявление локальных переменных, констант, курсоров, пользовательских исключений
§ Обязательная секция выполняемого кода – содержит команды SQL для манипулирования данными в базе и команды PL/SQL для манипулирования данными в блоке
§ Необязательная секция обработки исключений – определяет действия, связанные с обработкой ошибок сервера или пользовательских исключений, возникших в секции выполняемого кода
Синтаксические правила для блока PL/SQL
· Идентификаторы могут содержать до 30 символов и должны начинаться с буквы
· Зарезервированные слова могут использоваться в качестве идентификаторов только в том случае, если они заключены в кавычки (“SELECT”)
· Не выбирайте для идентификатора имя, совпадающее с именем столбца таблицы базы данных, используемой в блоке. При выполнении команды SQL Oracle всегда предполагает, что используется ссылка на столбец
· Предложение может занимать несколько строк, но ключевые слова переносить нельзя
· Лексические единицы (идентификаторы или литералы) могут быть разделены пробелами
Источник: vunivere.ru
Записная книжка ежа
SQL*Plus — программа для работы с СУБД Oracle посредством командной строки. Используя SQL*Plus можно выполнять команды SQL и PL/SQL в интерактивном режиме или используя сценарий.
Основное преимущество SLQ*Plus — доступность, т.к. инструмент доступен практически всегда, когда в системе установлен Oracle. При этом это достаточно мощный инструмент, используя который можно решать различные задачи на удаленных машинах.
К написанию этой статьи меня подтолкнула книга «Oracle SQL*Plus: The Definitive Guide, 2nd Edition», написанная Jonathan Gennick. Как обычно, появилось желание систематизировать информацию и представить ее в удобном виде.
При этом сразу считаю нужным оговориться, что я использую SQLplus для написания и выполнения скриптов на удаленных машинах, в этой статье описываю именно используемые для этого команды.
Область возможного использования SQLplus при этом гораздо шире, например — построение отчетов, в том числе в формате HTML.
Параметры, подключение к базе, запуск скриптов
Выполнить несколько строк кода (не передавая отдельный файл со скриптом), unix:
Выполнение SQL запросов
Запрос может состоять из нескольких строк, содержать комментарии, но не может содержать внутри пустые строки.
SQL> SELECT * /* All columns */ 2 FROM project;
Запрос может быть выполнен тремя способами:
- точка с запятой в конце запроса
SQL> INSERT INTO project 2 /* All columns */ 3 (project_id, project_name, project_budget) 4 VALUES (1006,’Mainframe Upgrade’,456789) 5 ;
- строка с слешем «/» после запроса
SQL> UPDATE project 2 SET project_budget = 1000000 3 WHERE project_id = 1006 4 /
- пустая строка после запроса (будет помещен в буфер, но не выполнен немедленно)
SQL> DELETE 2 FROM project 3 WHERE project_id = 1006 4 SQL> SQL> / 1 row deleted.
Выполнение PL/SQL блоков
Пример PL/SQL блока:
SQL> DECLARE 2 X VARCHAR2(12) := ‘Hello World!’; 3 BEGIN 4 DBMS_OUTPUT.PUT_LINE(X); 5 EXCEPTION 6 WHEN OTHERS THEN 7 DBMS_OUTPUT.PUT_LINE(‘An error occurred.’); 8 END; 9 / PL/SQL procedure successfully completed.
Правила выполнения PL/SQL блоков:
- Первое слово в PL/SQL блоке должно быть из списка: BEGIN, DECLARE, CREATE PROCEDURE,
CREATE FUNCTION, CREATE TRIGGER, CREATE PACKAGE, CREATE TYPE, CREATE TYPE BODY. Регистр не важен. - Блок может состоять из нескольких строк
- Можно вставлять /* комментарии */, они также могут быть на несколько строк
- Пустые строки не разрешены внутри блока
Сигнал к выполнению блока может быть подан двумя путями:
- Строка, содержащая только слеш «/» после блока — выполнить сразу
SQL> BEGIN 2 NULL; 3 END; 4 /
- Строка, содержащая точку «.» после блока — поместить в буфер. Содержимое буфера может быть выведено командой LIST и выполнено, путем указания одиночного слеша «/» или команды RUN.
SQL> BEGIN 2 NULL; 3 END; 4 .
Одиночное выражение PL/SQL может быть выполнено, используя:
EXECUTE plsql_statement
SQL> EXECUTE DBMS_OUTPUT.ENABLE(10000) PL/SQL procedure successfully completed.
В случае ошибок, при выполнении процедуры, можно отобразить их выполнив команду:
SHOW ERRORS
Работа с переменными
Переменные могут быть заданы двумя способами:
variable так и variable.
Если была определена variable, и скрипт запущен повтороно в ходе той же сессии работы с SQLplus — будет использовано старое значение переменной. Чтобы этого избежать — можно запрашивать интерактивный ввод в скрипте принудительно, испольтзуя команду:
ACCEPT table_name CHAR PROMPT ‘Enter the table name >’
ACCEPT можно использовать для валидации:
SQL> ACCEPT my_variable NUMBER FORMAT 999 PROMPT ‘Enter a number >’ Enter a number >1234 «1234» does not match input format «999» Enter a number >123 SQL>
Для ввода дат в определенном формате:
ACCEPT my_variable DATE FORMAT ‘MM/DD/YY’ PROMPT ‘Give me a date >’
SQL*Plus поддерживает четыре типа переменных: CHAR, NUMBER, BINARY_FLOAT, and BINARY_DOUBLE. При вводе с клавиатуры переменная будет типа CHAR.
Несмотря на это, можно использовать NEW_VALUE, чтобы задать числовую переменную, полученную как результат запроса.
SQL> COLUMN x NEW_VALUE m y_age SQL> SELECT 42 x FROM dual; X ———- 42 SQL> DEFINE my_age DEFINE MY_AGE = 42 (NUMBER)
Bind-переменные могут использоваться для передачи данных между PL/SQL и SQL блоками:
— Bind-переменные могут быть определены в скрипте VARIABLE s_table_name varchar2(30) — Можно ссылаться на bind-переменные в PL/SQL block. BEGIN :s_table_name := ‘EMPLOYEE’; END; / — Bind-переменные могут быть использованы и в SQL запросах. SELECT index_name FROM user_indexes WHERE table_name = :s_table_name; — Bind-переменные хранятся до выхода из SQL*Plus и могут быть использованы в нескольких PL/SQL блоках. SET SERVEROUTPUT ON BEGIN DBMS_OUTPUT.PUT_LINE(:s_table_name); END; /
Присвоить bind-переменной значение my_sub_num;
Вывести значение bind-переменной:
SQL> VAR my_bind_var VARCHAR2(35) SQL> EXECUTE :my_bind_var := ‘Brighten the corner where you are’; PL/SQL procedure successfully completed. SQL> PRINT my_bind_var MY_BIND_VAR —————————————————————— Brighten the corner where you are
Присвоить DEFINE my_sub_var = ‘ ‘ SQL> VAR my_bind_var VARCHAR2(35) SQL> EXECUTE :my_bind_var := ‘Brighten the corner where you are’; PL/SQL procedure successfully completed. SQL> COLUMN my_bind_var NEW_VALUE my_sub_var SQL> PRINT my_bind_var MY_BIND_VAR ———————————————————————- Brighten the corner where you are SQL> PROMPT ‘ VARIABLE can VARCHAR2(60) EXECUTE DBMS_UTILITY.CANONICALIZE(‘ COLUMN can HEADING ‘Canonicalized Reference IS:’ PRINT can
Условное выполнение в SQLplus:
ACCEPT s_delete_confirm PROMPT ‘Delete project hours data (Y/N)?’ DELETE FROM project_hours WHERE UPPER(‘s_delete_confirm’) = ‘Y’;
Пример скрипта, принимающего несколько переменных на вход в формате c возможностью задать дефолтные значения:
prompt Define parameters define script_param = «» column col_script_param new_value script_param noprint select replace(trim(‘1’), ‘ ‘) «col_script_param» from dual; undef 1 define parse_name_parameter = «var=» select nvl(max(regexp_replace(csv, ‘(.*)(parse_name_parameter)(.+?)(;|$)(.*)’, ‘define var=»3″;’, 1, 1, ‘i’)), ‘define var=default;’) r from (select ‘script_param’ csv from dual) where instr(upper(csv), upper(‘parse_name_parameter’)) != 0; define parse_name_parameter = «othervar=» select nvl(max(regexp_replace(csv, ‘(.*)(parse_name_parameter)(.+?)(;|$)(.*)’, ‘define othervar=»3″;’, 1, 1, ‘i’)), ‘define othervar=default_other;’) r from (select ‘script_param’ csv from dual) where instr(upper(csv), upper(‘parse_name_parameter’)) != 0; prompt prompt var: var prompt othervar: othervar prompt
Настройки выполнения скриптов
Действуют на протяжении сессии в SQLplus.
SET SERVEROUTPUT ON/OFF SIZE 1000000 FORMAT WORD_WRAPPED — отображать вывод dbms_output (размер буфера, байт) (разделение по строкам для длинного вывода) SET TERMOUT ON/OFF — включить/отключить вывод на экран терминала SET ECHO ON/OFF — включить/отключить отображение команд по мере выполнения SET VERIFY ON/OFF — включить/отключить отображение замененных переменных например, так: old 9: AND ui.table_name = UPPER(‘ SET ESCAPE ON SQL> DEFINE friends = «Joe SET ESCAPE / — задать другой символ экранирования (по умолчанию ) SET CONCAT ON/OFF — включить/отключить конкатенацию, символ конкатенации по умолчанию — точка «.» например: SQL> DEFINE sql_type = «PL/» SQL> PROMPT var, var)
Запомнить настройки перед выполнением скрипта и вернуть обратно по завершении выполнения:
Другие команды
PROMPT Show this text. — вывод текста на экран REMARK This is a comment. — комментарий в скрипте REM This is a comment too. — краткая форма записи REMARK SPOOL some_file.txt — включить вывод выполнения скрипта файл some_file.txt (будет обнулен) SPOOL some_file.txt APP — включить вывод выполнения скрипта файл some_file.txt (будет дозаписан) SPOOL OFF — отключить вывод в файл WHENEVER SQLERROR EXIT — выйти при ошибке SQL WHENEVER SQLERROR EXIT ROLLBACK — откатить транзакцию и выйти при ошибке SQL WHENEVER SQLERROR EXIT SQL.SQLCODE — выйти и вернуть код ошибки при ошибке SQL WHENEVER OSERROR EXIT — команды аналогичны WHENEVER SQLERROR . — но при ошибке операционной системы
Взаимодействие с unix shell
Обработать результат выполнения SQLplus-скрипта в Unix:
Вернуть код ответа в Unix:
#!/bin/bash sqlplus -s gennick/secret
Вывод из скрипты в переменную командной строки unix:
#!/bin/bash tabcount=`sqlplus -s gennick/secret
Источник: ezhvsalate.ru
Как моему подписчику удалось
научиться писать программы
на PL/SQL всего за 4 дня
Он научился создавать и отлаживать функции, процедуры и даже писать код с использованием курсоров.
Что здесь удивительного?
Если вы добросовестно выполняете уроки из моего email-курса, то вам должно быть понятно, как ему это удалось.
По большому счёту, это может сделать каждый.
Что представляет собой курс, который вы получаете по email?
Это пошаговые инструкции . Вы могли убедиться сами, что выполняя их на практике вы одновременно изучаете синтаксис команд и приобретает практические навыки по работе с базой данных на ORACLE.
При этом в курсе используется сквозной пример — создание программы для ведения простенькой базы по счетам на оплату товара.
Большая задача разбита на маленькие этапы. Каждый этап оформлен отдельным уроком. Проработав материал урока, мы тем самым чуть-чуть продвигаемся в решении большой задачи. При этом большую «проблему» мы превратили в полезный и познавательный процесс.
Причём взят типичный пример . В 7 случаях из 10 вы столкнётесь с практической задачей, которая работает с документами типа master-detail.
Другими словами, пройдя курс и взявшись за реальную задачу, вы можете её решить, применяя те подходы, которые были показаны в курсе — действовать по аналогии . По шаблончику.
И естественно, мой email-курс — это только первые шаги. Работа над реальным приложением не заканчивается созданием таблиц. Следующим этапом является реализация логики программы. Обычно, её пишут на PL/SQL и размещают эти программы на сервере.
Подписчик умудрился написать программу для реальной задачи за столь короткий срок потому, что не поленился и добросовестно проработал этот материал. И потом по аналогии (по шаблончику) написал код для своей задачи.
Вы тоже можете последовать его примеру и воспользоваться дополнительным учебным материалом.
Два дополнительных урока по языку PL/SQL
для желающих научиться писать
программы за 4 дня
Проработав материал этих уроков, вы будете знать основные элементы языка PL/SQL и сможете самостоятельно писать вполне добротный код.
«Процeдуры и функции на PL/SQL»
Цель: написать функции и процедуры для работы со счетами .
- Составление списка допустимых действий (анализ и постановка задачи).
- Проектирование программного интерфейса для работы с данными.
- Что такое PL/SQL-блок (какие бывают и для чего используются).
- Команды условного выполнения в языке PL/SQL.
- Отличие пользовательских функций от хранимых процедур.
- Команды создания и удаления хранимых процедур.
- Написание кода с использованием операторов условного выполнения.
- Чтение данных из таблиц в программах на PL/SQL.
- Вызов процедур из SQL*Plus.
- Создание пользовательских функций.
- Работа с bind-переменными в SQL*Plus.
«Пакеты в PL/SQL»
Цель: создать законченный модуль для выписки счетов .
- Планирование порядка следования транзакций.
- Что такое пакеты в PL/SQL.
- Понятие «курсор», типы курсоров.
- Операторы цикла в PL/SQL.
- Отладка программ на PL/SQL.
- Создание и грамотная компоновка пакета.
- Написание кода для чтения данных с помощью явного курсора.
- Вывод серверных сообщений.
- Написание цикла для работы с курсором.
Полная версия курса по ORACLE
в формате электронной книги
В дополнение к урокам по PL/SQL Вы получите также и весь материал из email-курса, поскольку он является основой — в уроках используется уже знакомый Вам учебный пример и база данных.
Уроки всего курса собраны в одну электронную книгу — это файл в формате PDF.
Общий объём книги ~130 обычных машинописных страниц.
Имея под рукой все уроки, Вы сможете выбрать свой тем обучения и не быть привязанными к получению материалов по электронной почте. И конечно, у Вас точно будет весь материал (ничего по дороге не потеряется).
В процессе работы:
- Вы узнаете, какие бывают переменные, где и как их правильно объявлять
- Какие в PL/SQL есть операторы управления (и какие варианты записи предусмотрены в синтаксисе языка)
- Вы будете знать, для чего нужны пользовательские функции (где они действительно могут быть полезны, а где лучше их заменить процедурами)
- Научитесь вызывать пользовательские функции (не только в программах на PL/SQL, но и в обычных SQL запросах)
- Вы научитесь создавать хранимые процедуры (и будете понимать принципиальное отличие процедуры от функции)
- Вы будете в состоянии самостоятельно определить, какая именно нужна процедура или функция для решения той или иной задачи (сможете сами спроектировать её интерфейсную часть и реализовать в коде на PL/SQL)
- Вы освоите работу с курсорами (будете знать, почему курсор является основным механизмом взаимодействия с базой данных)
- Разберёте на практике работу с явными и неявными курсорами
- Научитесь правильно писать обычные SELECT’ы прямо в PL/SQL коде (сможете передавать в запрос значения аргументов и правильно принимать результат, корректно обрабатывать возможные ошибки)
- Вы будете уметь писать программы с использованием явных курсоров (сможете объявить курсор и правильно написать код по работе с ним)
- Вы изучите пакеты и особенности их создания (что такое заголовок и тело пакета, и почему пакет может без BODY)
- Будете уметь компоновать пакеты так, чтобы они поддерживали высокоуровневые транзакции (это избавит вас от мук объектно-ориентированного подхода и код при этом будет хорошо сопровождаемым )
- Вы научитесь использовать программу SQL*Plus для проверки работоспособности функций и процедур
- Узнаете что такое bind-переменные, как их можно объявить в SQL*Plus и как с их помощью передавать/принимать значения при вызове функций и процедур
- Научитесь писать работающий код на PL/SQL (а работающим может считаться только отлаженный и протестированный код — вся фишка в том, как это делать)
- Из уроков вы узнаете простой и эффективный метод отладки программ на PL/SQL с использованием механизма серверных сообщений.
- В уроках вы найдёте пошаговые инструкции, это позволит вам самостоятельно воспроизвести код учебного примера (набрать руками и прокрутить в своей базе)
- Выполняя упражнения, вы более прочно усвоите синтаксис языка и наработаете практические навыки
- Вы получите шаблончики с кодом, которые сможете использовать при написании своих собственных программ
Важно ещё то, что вы сможете начать писать программы сразу после обучения. И уже потом, постепенно, в процессе практической работы, вы будете набираться опыта и знаний, нарабатывать свои приёмы программирования.
Реально работающий код вы сможете выдавать уже через несколько дней.
Я предлагаю Вам эти 2 урока всего за 796 рублей. Другими словами, стоимость моих педагогических услуг будет Для меня эта сумма ничего не значит, а вот Вам позволит сэкономить уйму времени.
Ведь без чёткого плана обучения, вам придётся изобретать велосипед и действовать методом «научного тыка». Сколько у Вас уйдёт времени на такое «пустое тыканье»?
Этот курс я использую для подготовки своих сотрудников (уже более 7 лет). Он так удачно составлен, что, во-первых, не зависит от версии ORACLE.
Во-вторых, даёт хороший и предсказуемый результат. Поэтому я в нём настолько уверен, что могу Вам гарантировать:
Проработав материал на практике,
Вы точно сможете писать
программы на PL/SQL
Конечно, гением программирования Вы в одночасье не станете, но если Вы не сможете писать обычные прикладные программы, то я безоговорочно верну деньги по первому Вашему требованию. Вам достаточно отправить мне письмо и прикрепить к нему исходные тексты из уроков.
Гарантия бессрочна. При таком раскладе Вы ничем не рискуете.
Если Вам действительно нужно поскорее освоить программирование на PL/SQL, то по моей методике Вы сможете этому научиться гарантированно и всего за несколько дней.
Для получения курса:
В письме сообщите своё имя, фамилию, удобный способ оплаты (сейчас можно оплатить банковским переводом, через Яндекс.Деньги или WebMoney, для жителей зарубежья — PayPal).
быстро освоить программирование для баз данных . Кто действительно выполняет упражнения из email-курса, а не просто просматривает письма ради любопытства.
Поэтому заказ можно сделать только в течениe 10 дней после получения 4-го письма email-курса (чтобы дополнительные уроки были у Вас на руках, когда Вы закончите создавать базу данных).
Если Вы перешли по ссылке из моего письма, то можете заказать прямо сейчас.
Кликните для заказа Уроки по PL/SQL
Источник: oracle-teach.ru