Эта глава при посредстве синтаксических диаграмм показывает, как формировать предложения PL/SQL из команд, параметров и отдельных элементов языка. Ее можно использовать как быстрый справочник по синтаксису и соглашениям кодирования PL/SQL. Кроме того, здесь даются замечания по использованию и приводятся краткие примеры.
Эта глава содержит следующие разделы:
| Предложение присваивания | Атрибут %NOTFOUND |
| Блоки | Предложение NULL |
| Предложение CLOSE | Предложение OPEN |
| Комментарии | Пакеты |
| Предложение COMMIT | Таблицы PL/SQL |
| Условия | Процедуры |
| Курсоры | Предложение RAISE |
| Предложение DELETE | Записи |
| Прагма EXCEPTION_INIT | Предложение RETURN |
| Исключения | Предложение ROLLBACK |
| Предложение EXIT | Атрибут %ROWCOUNT |
| Выражения | Атрибут %ROWTYPE |
| Предложение FETCH | Предложение SAVEPOINT |
| Атрибут %FOUND | Предложение SELECT INTO |
| Функции | Предложение SET TRANSACTION |
| Предложение GOTO | Курсор SQL |
| Предложение IF | Функция SQLCODE |
| Предложение INSERT | Функция SQLERRM |
| Атрибут %ISOPEN | Атрибут %TYPE |
| Литералы | Предложение UPDATE |
| Предложение LOCK TABLE | Переменные и константы |
| Предложение LOOP |
Каждый из этих разделов включает все или некоторые из следующих секций:
Как читать синтаксические диаграммы
Диаграмма использует линии со стрелками, показывающими, как упорядочены команды, параметры и другие элементы языка в предложении. Следуйте по диаграмме в направлении стрелок. Вам помогут следующие символы:
°°°°°°°° Отмечает начало диаграммы.
°°°°°°°° Отмечает конец диаграммы.
°°°°°°°°° Показывает, что диаграмма продолжается на следующей
строке.
°°°°°°°°- Показывает, что диаграмма продолжается с предыдущей
строки.
╡°°°°°°°°≈ Представляет цикл.
▀
Команды и иные ключевые слова показаны прописными, а параметры
строчными буквами. Операторы, разделители и терминаторы
показаны как обычно.
Если диаграмма содержит несколько возможных путей, вы должны выбрать путь, подходящий для вашего случая.
Если имеется выбор из нескольких ключевых слов, операторов или параметров, то эти опции изображаются в виде вертикального списка. В следующих примерах вы должны выбрать один из элементов списка и продолжить движение по диаграмме вдоль соответствующей линии:
°° °°°°°°° °° °° °° date_литерал °°°°° °° ╡°° / °°≈
│°° + °°▄ │°° date_переменная °°▄ │°° * °°▄
≤°° - °°╠ │°° date_функция °°°°°▄ │°° - °°▄
│°° NULL °°°°°°°°°°°°°▄ ╡°≥°° + °°≥°°≈
≤°° (date_выражение) °╠ ▀
Обязательные параметры
Обязательные параметры могут появляться поодиночке или в вертикальном списке альтернатив. Одиночные обязательные параметры появляются на ОСНОВНОМ ПУТИ, т.е. на той горизонтальной линии, по которой вы продвигаетесь. В следующем примере имя_курсора является обязательным параметром:
°°°°°°°°°° CLOSE °°°°°°°°°°°° имя_курсора °°°°°°°°° ; °°°°°°°°°°°°°°Если имя вашего курсора - c1, то, согласно диаграмме, следующее предложение синтаксически правильно:
CLOSE c1;
Если хотя бы один из параметров в вертикальном списке появляется
на основном пути, это означает, что выбор параметра обязателен.
Иными словами, вы должны выбрать один из параметров, но
необязательно тот из них, который изображен вдоль основного
пути. В следующем примере вы обязаны выбрать один из четырех
типов выражений:
°°°°°°°°°°°°°°°°°°°°°° °° num_выражение °°°°° °°°°°°°°°°°°°°°°°°°°°°
│°° char_выражение °°°°▄
│°° date_выражение °°°°▄
≤°° boolean_выражение °╠
Необязательные параметры
Если параметры появляются в вертикальном списке ниже основного пути, то они необязательны, т.е. вы не обязаны выбирать один из них. В следующем примере, вместо того, чтобы спускаться по вертикальной линии к параметру, вы можете продолжить движение по основному пути:
°°°°°°°°°°°°° COMMIT °°°° °°°°°°°°°° ° °°°°°°°°°°°°°°°°°°°°° ° ; °°°
≤°° WORK °°╠ ≤°° COMMENT 'текст' °°╠
Согласно этой диаграмме, все приведенные ниже предложения
синтаксически правильны:
COMMIT;
COMMIT WORK;
COMMIT COMMENT 'In-doubt transaction; notify Order Entry';
COMMIT WORK COMMENT 'In-doubt transaction; notify Order Entry';
Синтаксические циклы
Циклы позволяют вам повторять синтаксис, заключенный в них, любое число раз. В следующем примере список объявлений находится в цикле. Следовательно, выбрав один тип объявления, вы можете вернуться по циклу и снова выбрать такой же или иной тип.
°°°°°°°° °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° °°°°°°°
▀ ╡°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°≈ ▀
≤°°° DECLARE °°°V°°° °° объявление_переменной; °° °≥°╠
│°° объявление_курсора; °°°°°▄
│°° объявление_исключения;°°°▄
│°° объявление_записи; °°°°°°▄
│°° объявление_таблицы_plsql°▄
│°° объявление_процедуры; °°°▄
≤°° объявление_функции; °°°°°╠
Согласно этой диаграмме, все следующие примеры корректны:
Первый пример:
DECLARE
credit_limit CONSTANT NUMBER(9,2) := 5000.00;
Второй пример:
DECLARE
over_limit EXCEPTION;
past_due EXCEPTION;
Третий пример:
DECLARE
account_name CHAR(25);
over_limit EXCEPTION;
new_balance NUMBER(9,2);
old_balance NUMBER(9,2);
past_due EXCEPTION;
Составные диаграммы
Части составной диаграммы следует рассматривать так, как будто они соединены концами. Следующий пример показывает диаграмму из двух частей:
°°°° INSERT °°° INTO °°° имя_таблицы ° °°°°°°°°°°°°°°°°°°°°°°°°°°° °°
▀ ╡°°°°° , °°°°°°°≈ ▀
≤° ( °° имя_столбца °≥° ) °╠
╡°°°° , °°°°°°°°°°°°≈
°°°°°°°° °° VALUES ° ( °°° plsql_выражение °≥° ) °°°°° °°°°° ; °°°°°
≤°°°°°°°°°°° select_предложение °°°°°°°°╠
Предположим, есть таблица salaries со столбцами grade, low,
middle и high. Тогда, согласно этой диаграмме, следующее
предложение корректно:
INSERT INTO salaries (grade, low, high) VALUES (4,2000,2999);
Как кодировать предложение по синтаксической диаграмме
Чтобы составить предложение по диаграмме, начните с метки начала и передвигайтесь по линиям и стрелкам. Встретив ключевое слово, воспроизведите его точно как показано (безразлично, строчными или прописными буквами). Встретив параметр, подставьте вместо него значение, идентификатор или объект, который он представляет. (Если для параметра существует собственная диаграмма, пройдите по ней, а затем вернитесь). Встретив оператор, разделитель или терминатор, воспроизведите его точно как показано. Разделяйте ключевые слова и идентификаторы пропусками.
В следующем примере вам встречается сначала ключевое слово, затем параметр, и, наконец, терминатор:
°°°°°°°°°° GOTO °°°°°°°°°°°° имя_метки °°°°°°°°° ; °°°°°°°°°°°°°°°°°Если ваша метка имеет имя end_loop, то, согласно диаграмме, вы должны записать предложение следующим образом:
GOTO end_loop;
Не забывайте прочитать описания параметров и замечания по
использованию. Использование некоторых ключевых слов может
потребовать кодирования фраз, которые обычно не обязательны.
Например, если вы используете ключевое слово CONSTANT в
объявлении_переменной, то вы должны включить фразу
инициализации.
Описание
Предложение присваивания устанавливает текущее значение переменной, формального параметра, поля в записи или строки в таблице PL/SQL. Для дополнительной информации обратитесь к разделу "Объявления и присваивания" в главе 2.
Синтаксис
предложение_присваивания ::=
°°°° имя_объекта °°°°°°°°° := °°°° plsql_выражение °°°° ; °°°°°°°°°°объект ::=
°°°°°°°°°°°°°°°°°°°°°° °° plsql_переменная °°°°°°°° °°°°°°°°°°°°°°°°
│°° запись.поле °°°°°°°°°°°°°▄
│°° plsql_таблица(индекс) °°°▄
≤°° :хост_переменная °°°°°°°°╠
Альтернативно, вы можете использовать предложения SELECT и
FETCH, чтобы заставить ORACLE присвоить значение переменной.
Для дополнительной информации см. разделы "FETCH" и "SELECT
INTO" ниже в этой главе.
Ключевые слова и параметры
Замечания по использованию
По умолчанию, если объект не инициализируется в своем объявлении, он инициализируется значением NULL при каждом входе в блок или подпрограмму. Поэтому никогда не обращайтесь к объекту до того, как присвоите ему значение.
Нельзя присваивать значение NULL объекту, объявленному как NOT NULL. При попытке сделать это возбуждается предопределенное исключение VALUE_ERROR.
Булевской переменной можно присваивать лишь значения TRUE, FALSE или NULL. Операторы отношений, применяемые к выражениям PL/SQL, возвращают булевское значение. Поэтому следующее присваивание законно:
DECLARE
out_of_range BOOLEAN;
...
BEGIN
...
out_of_range := (salary < minimum) OR (salary > maximum);
Как показывает следующий пример, вы можете присвоить значение
plsql_выражения конкретному полю записи:
DECLARE
emp_rec emp%ROWTYPE;
BEGIN
...
emp_rec.sal := current_salary + increase;
Более того, вы можете присвоить значения одновременно всем полям
записи. PL/SQL разрешает агрегатные присваивания между двумя
записями, если их объявления ссылаются на один и тот же курсор
или таблицу. Например, следующее присваивание законно:
DECLARE
emp_rec1 emp%ROWTYPE;
emp_rec2 emp%ROWTYPE;
dept_rec dept%ROWTYPE;
BEGIN
...
emp_rec1 := emp_rec2;
Следующее присваивание НЕЗАКОННО, потому что нельзя использовать
оператор присваивания для присваивания записи списка значений:
dept_rec := (60, 'PUBLICITY', 'LOS ANGELES');
Можно присвоить значение выражения PL/SQL конкретной строке
таблицы PL/SQL, используя синтаксис
plsql_таблица(значение_первичного_ключа) := plsql_выражение;
В следующем примере значение переменной last_name, переведенное
в прописные буквы, присваивается третьей строке таблицы PL/SQL с
именем ename_tab:
ename_tab(3) := UPPER(last_name);
Примеры
wages := hours_worked * hourly_salary;
country := 'France';
costs := labor + supplies;
done := (count > 100);
dept_rec.loc := 'BOSTON';
comm_tab(5) := sales * 0.15;
Связанные темы
Выражения, FETCH, SELECT INTO, Переменные и константы
Описание
Основной программной единицей в PL/SQL является блок. Блок PL/SQL определяется с помощью следующих ключевых слов:
В любом месте блока, где можно поместить выполнимое предложение, вы можете вставить новый, вложенный блок PL/SQL. Для дополнительной информации обратитесь к разделам "Структура блоков" и "Сфера и видимость" в главе 2.
Синтаксис
plsql_блок ::=
°°°°°°°°°°°°°°°°°°°°°°°° °°°°°°°°°°°°°°°°°°° °°°°°°°°°°°°°°°°°°°°°°°°
≤°° <<имя_метки>> °°╠
°°°°° °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° °°°°°°°°°°°°°°°
▀ ╡°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°≈▀
≤°°° DECLARE °°° ° объявление_переменной; °°° °≥╠
│° объявление_курсора; °°°°°°▄
│° объявление_исключения;°°°°▄
│° объявление_записи; °°°°°°▄
│° объявление_plsql_таблицы;°▄
│° объявление_процедуры;°°°°°▄
≤° объявление_функции;°°°°°°°╠
°°°°° BEGIN °°°°°°°° ряд_предложений °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
°°°°° °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° °°°° END °°°°°°
▀ ╡°°°°°°°°°°°°°°°°°°°°°°°°°°°°≈ ▀
≤°° EXCEPTION °°°°° обработчик_исключений; °°≥°°╠
°°°°°°°°°°°°°°°°°°°°°° °°°°°°°°°°°°°°° °°°°°°°° ; °°°°°°°°°°°°°°°°°°°
≤°° имя_метки °°╠
Ключевые слова и параметры
имя_метки
Это необъявляемый идентификатор задает необязательное имя блока PL/SQL. Имя блока должно удовлетворять соглашениям для ИДЕНТИФИКАТОРА, описанным в разделе "Идентификаторы" в главе 2. Имя блока, если оно используется, должно появиться в начале блока, и должно быть заключено в двойные угловые скобки. (Однако в среде SQL*Plus первая строка, которую вы вводите, не может начинаться с имени метки.) Имя блока может также (необязательно) появиться в конце блока.
Из-за правил сферы PL/SQL, если вы объявляете объект в окружающем блоке и переобъявляете его в подблоке, то подблок не может обращаться к объекту в окружающем блоке. Однако, если окружающий блок имеет метку (имя_блока), то вложенный блок может ссылаться на объект окружающего блока с помощью синтаксиса:
имя_блока.глобальный_идентификатор
В следующем примере вы сравниваете две переменных типа INTEGER,
объявленных в окружающем блоке и подблоке с одинаковыми именами:
<>
DECLARE
x INTEGER;
BEGIN
...
DECLARE
x INTEGER;
BEGIN
...
IF x = outer.x THEN
...
END IF;
END;
END outer;
DECLARE
DECLARE обозначает начало декларативной части блока PL/SQL, содержащей локальные объявления. Объекты, объявляемые локально, существуют только в текущем блоке и всех его подблоках. Эти объекты невидимы блокам, окружающим текущий блок.
Декларативная часть блока PL/SQL не обязательна. Она заканчивается неявно словом BEGIN, которое начинает исполняемую часть блока.
PL/SQL не допускает ссылок вперед. Вы должны объявить объект, прежде чем ссылаться на него в других предложениях, в том числе в других объявлениях.
В декларативной части блока можно использовать прагму EXCEPTION_INIT, чтобы ассоциировать имена исключений с номерами ошибок ORACLE. Обратитесь к разделу "Использование EXCEPTION_INIT" в главе 5.
объявление_переменной
Этот конструкт объявляет константу или переменную PL/SQL. Синтаксис объявления_переменной приведен в разделе "Переменные и константы" ниже в этой главе.
объявление_курсора
Этот конструкт объявляет явный курсор PL/SQL. Синтаксис объявления_курсора приведен в разделе "Курсоры" ниже в этой главе.
объявление_исключения
Этот конструкт объявляет исключение PL/SQL. Синтаксис объявления_исключения приведен в разделе "Исключения" ниже в этой главе.
объявление_записи
Этот конструкт объявляет пользовательскую запись. Синтаксис объявления_записи приведен в разделе "Записи" ниже в этой главе.
объявление_plsql_таблицы
Этот конструкт объявляет таблицу PL/SQL. Синтаксис объявления_plsql_таблицы приведен в разделе "Таблицы PL/SQL" ниже в этой главе.
объявление_процедуры
Этот конструкт объявляет процедуру. Синтаксис объявления_процедуры приведен в разделе "Процедуры" ниже в этой главе.
объявление_функции
Этот конструкт объявляет функцию. Синтаксис объявления_функции приведен в разделе "Процедуры" ниже в этой главе.
BEGIN
Это ключевое слово обозначает начало исполняемой части блока PL/SQL, которая содержит выполняемые предложения. Это единственная обязательная часть блока или подпрограммы PL/SQL; иными словами, блок или подпрограмма должны содержать хотя бы одно исполняемое предложение. Это предложение может быть пустым, как показывает следующий пример:
BEGIN
NULL;
END;
ряд_предложений
Этот параметр обозначает последовательность предложений. Синтаксис этого параметра имеет вид:
ряд_предложений ::=
╡°°°°°°°°°°°°°°°°°°°≈
°°°°°°°°°°°°°°°°°°°°°°°°° предложение ; °°≥°°°°°°°°°°°°°°°°°°°°°°°°
где "предложение" может быть любым законным предложением PL/SQL,
в том числе другим блоком PL/SQL. Заметьте, что объявления
переменных, констант и исключений не являются предложениями.
предложение
Вы используете этот конструкт языка для создания алгоритмов. Существуют предложения PL/SQL для последовательного, итеративного и условного управления, а также для обработки ошибок. Предложения PL/SQL имеют свободный формат, т.е. их можно переносить со строки на строку, при условии, что вы не расщепляете между строками ключевые слова, разделители или литералы. Каждое предложение PL/SQL должно заканчиваться точкой с запятой (;).
Синтаксис предложения PL/SQL:
предложение ::=
°°°° °°°°°°°°°°°°°°°°° °°° °° предложение_присваивания °° °°°°°°°°°°
≤° <<имя_метки>> °╠ │°° exit_предложение °°°°°°°°°°▄
│°° goto_предложение °°°°°°°°°°▄
│°° if_предложение °°°°°°°°°°°°▄
│°° loop_предложение °°°°°°°°°°▄
│°° null_предложение °°°°°°°°°°▄
│°° raise_предложение °°°°°°°°°▄
│°° return_предложение °°°°°°°°▄
│°° sql_предложение °°°°°°°°°°°▄
≤°° plsql_блок °°°°°°°°°°°°°°°°╠
sql_предложение
Ниже приведен синтаксис sql_предложения, которое определено в PL/SQL как специальное подмножество всех предложений SQL, из которого исключены предложения определения данных и предложения управления данными:
sql_предложение ::=
°°°°°°°°°°°°°°°°°°°°°°°°°° °° close_предложение °°°°°°°°°°°° °°°°°°°
│°° commit_предложение °°°°°°°°°°°▄
│°° delete_предложение °°°°°°°°°°°▄
│°° fetch_предложение °°°°°°°°°°°°▄
│°° insert_предложение °°°°°°°°°°°▄
│°° lock_table_предложение °°°°°°°▄
│°° open_предложение °°°°°°°°°°°°°▄
│°° rollback_предложение °°°°°°°°°▄
│°° savepoint_предложение °°°°°°°°▄
│°° select_предложение °°°°°°°°°°°▄
│°° set_transaction_предложение °°▄
≤°° update_предложение °°°°°°°°°°°╠
EXCEPTION
Это ключевое слово обозначает начало части обработки исключений блока PL/SQL. Когда возбуждается исключение, нормальная работа блока останавливается, и управление передается на соответствующий обработчик исключений. После завершения работы обработчика выполнение продолжается с предложения, следующего за блоком, вызвавшим исключение.
Если в текущем блоке нет обработчика для возбужденного исключения, то управление передается в окружающий блок. Этот процесс повторяется до тех пор, пока не будет найден обработчик исключения, или пока не будут исчерпаны окружающие блоки. Если PL/SQL не смог найти обработчика для данного исключения, то выполнение самого внешнего блока PL/SQL прекращается, и ошибка "необрабатываемое исключение" возвращается в окружение, из которого был вызван PL/SQL. Для дополнительной информации обратитесь к главе 5.
обработчик_исключений
Синтаксис обработчика_исключений приведен в разделе "Исключения" ниже в этой главе. В общем случае, обработчик исключений указывает имена конкретных исключений и определяет предложения, которые будут выполняться при возбуждении любого из этих исключений, как показывает следующий пример:
/* ZERO_DIVIDE и VALUE_ERROR - предопределенные исключения. */
EXCEPTION
WHEN ZERO_DIVIDE THEN -- деление на 0
ROLLBACK;
WHEN VALUE_ERROR THEN -- нарушение ограничения
INSERT INTO audit_table
VALUES(trans_id, kind, amount, 'Overflow Error');
COMMIT;
...
END;
END
Ключевое слово END обозначает конец блока PL/SQL. Оно должно
быть последним ключевым словом в блоке. Ни END IF, завершающее
предложение IF, ни END LOOP, завершающее предложение LOOP, не
могут заменить ключевого слова END.
Пример
-- доступен на диске в файле EXAMP11
DECLARE
numerator NUMBER;
denominator NUMBER;
the_ratio NUMBER;
LOWER_LIMIT CONSTANT NUMBER := 0.72;
SAMP_NUM CONSTANT NUMBER := 132;
BEGIN
SELECT x, y INTO numerator, denominator FROM result_table
WHERE sample_id = samp_num;
the_ratio := numerator/denominator;
IF the_ratio > lower_limit THEN
INSERT INTO ratio VALUES (samp_num, the_ratio);
ELSE
INSERT INTO ratio VALUES (samp_num, -1);
END IF;
COMMIT;
EXCEPTION
WHEN ZERO_DIVIDE THEN
INSERT INTO ratio VALUES (samp_num, 0);
COMMIT;
WHEN OTHERS THEN
ROLLBACK;
END;
Связанные темы
Исключения, Курсоры, Переменные и константы, Процедуры
Описание
Предложение CLOSE освобождает ресурсы, удерживаемые открытым курсором, для повторного их использования. После закрытия курсора из него больше нельзя извлекать никаких строк. Информация параметров и синтаксически разобранное представление ассоциированного запроса помечаются как доступные для повторного использования. Для дополнительной информации обратитесь к разделу "Обработка транзакций" в главе 4.
Синтаксис
close_предложение ::= °°°°°°°°°°°°° CLOSE °°°°°°° имя_курсора °°° ; °°°°°°°°°°°°°°°°°°°°°°
Ключевые слова и параметры
Замечания по использованию
После того как курсор закрыт, вы можете повторно открыть его, чтобы заново вычислить параметры и реинициализировать активное множество, - либо с помощью явной команды OPEN, либо посредством курсорного цикла FOR, чтобы неявно открыть курсор. Попытка выполнить любую другую операцию на закрытом курсоре возбуждает предопределенное исключение INVALID_CURSOR.
Вы должны закрыть курсор, прежде чем повторно открывать его.
Связанные темы
DECLARE, FETCH, OPEN
Описание
Комментарии описывают назначение и использование сегментов кода, и тем самым способствуют его читабельности. PL/SQL поддерживает две формы комментариев: однострочные и многострочные. Однострочный комментарий начинается с двойного дефиса (--) и заканчивается концом строки. Многострочный комментарий начинается с пары символов /* и заканчивается парой символов */, и может занимать несколько строк. Для дополнительной информации обратитесь к разделу "Комментарии" в главе 2.
Синтаксис
комментарий ::= °°°°°°°°°°°°°°°°°°°°°° -- °°°°°° текст °°°°°°°°°°°°°°°°°°°°°°°°°°°°° °°°°°°°°°°°°°°°°° /* °°°°° текст °°°°°° */ °°°°°°°°°°°°°°°°°°°°°°°°°
Замечания по использованию
Комментарии могут появляться в предложении у конца строки. Однако нельзя вкладывать комментарии друг в друга. Кроме того, нельзя использовать однострочные комментарии в блоке PL/SQL, который будет динамически обрабатываться программой прекомпилятора PL/SQL, потому что при этом символы конца строки игнорируются, и, как следствие, однострочный комментарий распространится до конца блока, а не до конца строки. В таких случаях используйте многострочные комментарии.
При отладке программы комментарий позволяет временно отключить часть кода программы. Следующий пример показывает, как можно "закомментировать" предложение SQL:
-- UPDATE dept SET loc = my_loc WHERE deptno = my_deptno;
С помощью многострочных комментариев можно "закомментировать"
целый участок кода.
Примеры
-- вычислить площадь круга
area := pi * radius**2; -- pi равно 3.14159
/* вычислить площадь
круга */
area := pi * radius**2; /* pi равно 3.14159 */
Описание
Предложение COMMIT завершает текущую транзакцию и делает постоянными все изменения, осуществленные в течение этой транзакции. До этого момента другие пользователи не могут видеть измененных данных; они видят данные в том состоянии, каким оно было к моменту начала транзакции. Для дополнительной информации обратитесь к разделу "Обработка транзакций" главы 4.
Синтаксис
commit_предложение ::=
°°°°°°°°°°°°° COMMIT °°°° °°°°°°°°°° ° °°°°°°°°°°°°°°°°°°°°° ° ; °°°
≤°° WORK °°╠ ≤°° COMMENT 'текст' °°╠
Ключевые слова и параметры
COMMIT и COMMIT WORK
Оба варианта, COMMIT и COMMIT WORK, работают одинаково. Ключевое слово WORK необязательно и предназначено лишь для улучшения читабельности.
COMMENT
COMMENT задает комментарий, который ассоциируется с текущей транзакцией и используется чаще всего с распределенными транзакциями. Текст должен представлять собой литерал в апострофах длиной не более 50 символов.
Замечания по использованию
Предложение COMMIT освобождает все блокировки строк и таблиц. Оно также стирает все точки сохранения, созданные вами после последней операции COMMIT или ROLLBACK. До тех пор, пока вы не выполнили COMMIT, справедливы следующие утверждения:
Если распределенная транзакция сбивается, то текст, заданный в фразе COMMENT, помогает вам диагностировать проблему. Если распределенная транзакция в каком-либо смысле сомнительна, ORACLE сохраняет ваш комментарий в словаре данных вместе с идентификатором транзакции. Для дополнительной информации о распределенных транзакциях обратитесь к документу ORACLE7 Server Application Developer's Guide.
Встроенный SQL разрешает использовать после слов COMMIT WORK необязательный параметр RELEASE. Этот параметр, выполняющий функции команды DISCONNECT, указывает, что вы хотите отсоединиться от базы данных после подтверждения транзакции. Так как PL/SQL, однако, не допускает предложений управления данными, таких как CONNECT, GRANT или REVOKE, он не допускает и параметра RELEASE.
Связанные темы
ROLLBACK, SAVEPOINT
Описание
Условия PL/SQL составляют основу для условного управления. Как и у булевских выражений, результатом вычисления условия может быть TRUE, FALSE или NULL. Более того, условие PL/SQL допускается всюду, где допустимо булевское выражение.
В предложениях условного управления, если условие PL/SQL дает TRUE, выполняется соответствующая последовательность предложений. Если условие PL/SQL дает FALSE либо NULL, то соответствующая последовательность предложений НЕ выполняется. Для дополнительной информации обратитесь к разделу "Выражения и сравнения" в главе 2.
Синтаксис
plsql_условие ::= булевское_выражение
булевское_выражение ::=
╡°°°°°°°°°°°°°°°°°° °° AND °° °°°°°°°°°°°°°°°°°°°≈
▀ ≤°° OR °°°╠ ▀
°°°°°°° °°°°°°° °° °° булевский_литерал °°°°°°° °°°°≥°°°°°°°°°°°°°°
≤° NOT °╠ │°° булевская_переменная °°°°▄
│°° булевская_функция °°°°°°°▄
│°° прочие_булевские_формы °°▄
≤°° (булевское_выражение) °°°╠
прочие_булевские_формы ::=
°°°°°°°°°°°°°°°°°°°°°°°°°° plsql_выражение °°°°°°°°°°°°°°°°°°°°°°°°°°
°° °°°°°°°°°°°°°°°°°°°°°° оператор_сравнения °°° plsql_выражение° °°
│°°°°°°°°°°°°°° IS °°°°°°°°° °°°°°°° °°°°° NULL °°°°°°°°°°°°°°°▄
▀ ≤° NOT °╠ ▀
│°°°°°°°°°°°°°°°° °°°°°°° °°°°°° LIKE °°°° образец °°°°°°°°°°°°▄
▀ ≤° NOT °╠ ▀
│°°° °°°°°°° °° BETWEEN °°° plsql_выраж °° AND °° plsql_выраж °▄
▀ ≤° NOT °╠ ▀
▀ ╡°°°°°°° , °°°°°°°°°≈ ▀
│°°° °°°°°°° ° IN °° ( °°° plsql_выражение °≥°°°°° ) °°°°°°°°°▄
▀ ≤° NOT °╠ ▀
≤°°°°° ° имя_курсора ° °°°°°°° °° %NOTFOUND °° °°°°°°°°°°°°°°°°╠
≤° SQL °°°°°°°°°╠ │°° %FOUND °°°°°▄
≤°° %ISOPEN °°°°╠
Ключевые слова и параметры
AND, OR, NOT
AND, OR и NOT - это булевские операторы, работающие согласно логике трех состояний, иллюстрируемой таблицами истинности на Рис.2-4 в главе 2. AND возвращает TRUE, если оба операнда истинны. OR возвращает TRUE, если любой из операндов истинен. NOT возвращает противоположное значение (логическое отрицание) своего операнда. NOT NULL возвращает NULL, так как пустые значения не определены. Для дополнительной информации см. замечания по использованию, а также раздел "Логические операторы" в главе 2.
булевский_литерал
БУЛЕВСКИЙ_ЛИТЕРАЛ - это константа TRUE, FALSE или NULL. Значения TRUE и FALSE нельзя вставлять в столбец базы данных.
булевская_переменная
БУЛЕВСКАЯ_ПЕРЕМЕННАЯ - это любая переменная или константа, объявленная в ОБЪЯВЛЕНИИ_ПЕРЕМЕННОЙ с типом BOOLEAN. Булевская переменная может принимать лишь три значения: TRUE, FALSE или NULL. Однако нельзя извлекать или выбирать в булевскую переменную значение столбца. Кроме того, арифметические операции на булевских переменных НЕЗАКОННЫ.
булевская_функция
БУЛЕВСКАЯ_ФУНКЦИЯ - это вызов любой функции, возвращающей значение типа BOOLEAN.
булевское_выражение
Если БУЛЕВСКОЕ_ВЫРАЖЕНИЕ окружено скобками и является частью большего БУЛЕВСКОГО_ВЫРАЖЕНИЯ, то PL/SQL вычисляет выражение в скобках первым. Затем результат подставляется как единственное булевское значение в большее выражение.
plsql_выражение
Это выражение произвольной сложности. Синтаксис PLSQL_ВЫРАЖЕНИЯ определяется в разделе "Выражения" ниже в этой главе.
оператор_сравнения
Операторы сравнения позволяют сравнивать сколь угодно сложные выражения. Эти операторы описаны в разделе "Операторы сравнения" в главе 2.
IS [NOT] NULL
Оператор IS NULL возвращает булевское значение TRUE, если его операнд есть NULL, и FALSE в противном случае.
[NOT] LIKE
Оператор LIKE используется для сравнения символьной строки с образцом. При таких сравнениях прописные и строчные буквы считаются различными. LIKE возвращает булевское значение TRUE, если строка удовлетворяет образцу, и FALSE в противном случае.
образец
Это выражение представляет собой символьную строку, используемую в операторе LIKE для сопоставления с заданным строковым значением. Образец может включать два специальных символа. Символ подчеркивания (_) считается совпадающим с любым одиночным символом строкового значения. Символ процента (%) считается совпадающим с нулем или более любых символов строкового значения.
[NOT] BETWEEN
Оператор BETWEEN проверяет, лежит ли значение в заданном интервале. Он означает "больше или равно значение1" и "меньше или равно значение2".
[NOT] IN
Оператор IN проверяет членство в множестве. Он означает "равно любому члену множества". Множество может содержать значения NULL, но они игнорируются. Более того, выражение вида значение NOT IN множество дает FALSE, если множество содержит NULL.
имя_курсора
Этот параметр должен быть именем ранее объявленного курсора.
%NOTFOUND, %FOUND, %ISOPEN
%NOTFOUND, %FOUND и %ISOPEN - это атрибуты курсора. Каждый курсор, явно объявленный вами, имеет эти атрибуты. Они позволяют вам получать полезную информацию о выполнении многострочного запроса. Атрибуты курсора позволяют также обращаться к личной области SQL курсора SQL, что дает информацию о последнем выполненном предложении SQL. Для дополнительной информации обратитесь к разделу "Управление курсорами" в главе 4.
Замечания по использованию
PLSQL_УСЛОВИЕ позволяет сравнивать лишь значения совместимых друг с другом (или преобразуемых друг в друга) типов данных. Для дополнительной информации обратитесь к разделу "Преобразования типов данных" в главе 2.
Когда PL/SQL вычисляет БУЛЕВСКОЕ_ВЫРАЖЕНИЕ, NOT имеет высший приоритет, затем AND, и в последнюю очередь OR. Однако вы можете использовать скобки, чтобы изменить умалчиваемый порядок вычислений.
Логические операторы OR и AND вычисляют сначала свой левый операнд. Если значение результата операции можно определить по значению левого операнда, то правый операнд не вычисляется. Конкретно, если левый операнд операции OR равен TRUE или левый операнд операции AND равен FALSE, то правый операнд вычисляться не будет.
Операторы сравнения могут применяться к операндам типа BOOLEAN. По определению, TRUE больше, чем FALSE. Сравнения, в которых участвует NULL, всегда дают NULL.
Значения булевских выражений могут присваиваться только булевским переменным, но не хост-переменным и не столбцам базы данных. Более того, не существует неявных или явных преобразований типа данных из булевского или в булевский тип.
Связанные темы
Предложение присваивания, EXIT, Выражения, IF, LOOP
Описание
Объявление курсора именует курсор и ассоциирует его с запросом. КУРСОР - это рабочая область, используемая ORACLE при обработке многострочных запросов для отслеживания текущей строки. Для дополнительной информации обратитесь к разделам "Курсоры" в главе 1 и "Управление курсорами" в главе 4.
Синтаксис
объявление_курсора ::=
°°°°°°°°°°°°°°°°°°°°°° CURSOR ° имя_курсора °°°°°°°°°°°°°°°°°°°°°°°°°
°°°°°°°°°°°°°°° °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° °°°°°°°°°°
▀ ╡°°°°°°°°°°°°°°° , °°°°°°°°°°°°°°°°≈ ▀
≤°(°° имя_параметра °° тип_параметра °≥°)°╠
°°°°°°°°°°°°°°°°°°°° IS °°°°° select_предложение °°°°°°°°°°°°°°°°°°°°
спецификация_курсора ::=
°°°°°°°°°°°°°°°°°°°°°° CURSOR ° имя_курсора °°°°°°°°°°°°°°°°°°°°°°°°°
°°°°°°°°°°°°°°° °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° °°°°°°°°°°
▀ ╡°°°°°°°°°°°°°°° , °°°°°°°°°°°°°°°°≈ ▀
≤°(°° имя_параметра °° тип_параметра °≥°)°╠
°°°°°°°° RETURN °°°°°°°°°°° ° имя_типа °°°°°°°°°°°°° °°°°°°°°°°°°°°°°
│° переменная%TYPE °°°°°°▄
│° таблица.столбец%TYPE °▄
≤° таблица%ROWTYPE °°°°°°╠
тело_курсора ::=
°°°°°°°°°°°°°°°°°°°°°° CURSOR ° имя_курсора °°°°°°°°°°°°°°°°°°°°°°°°°
°°°°°°°°°°°°°°° °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° °°°°°°°°°°
▀ ╡°°°°°°°°°°°°°°° , °°°°°°°°°°°°°°°°≈ ▀
≤°(°° имя_параметра °° тип_параметра °≥°)°╠
°°°°°°°° RETURN °°°°°°°°°°° ° имя_типа °°°°°°°°°°°°° °°°°°°°°°°°°°°°°
│° переменная%TYPE °°°°°°▄
│° таблица.столбец%TYPE °▄
≤° таблица%ROWTYPE °°°°°°╠
°°°°°°°°°°°°°°°°°°°° IS °°°°° select_предложение °°°°°°°°°°°°°°°°°°°°
Ключевые слова и параметры
имя_курсора
Этот идентификатор задает имя, по которому вы будете обращаться к курсору. Синтаксис ИМЕНИ_КУРСОРА совпадает с синтаксисом имени функции, и подчиняется обычным правилам сферы. См. раздел "Идентификаторы" в главе 2.
имя_параметра
Это формальный параметр курсора. См. раздел "Идентификаторы" в главе 2.
Параметр курсора может использоваться в запросе всюду, где допускается константа. Формальные параметры курсора должны быть входными параметрами. Для информации о модах параметров обратитесь к главе 6. Запрос может также обращаться к другим переменным PL/SQL в своей сфере.
тип_параметра
Специфицирует тип данных параметра курсора. Тип данных соответствующего фактического параметра, передаваемого курсору (в предложении OPEN), должен быть совместимым с ТИПОМ_ПАРАМЕТРА (или преобразуемым в него). Для дополнительной информации обратитесь к разделу "Преобразования типов данных" в главе 2.
RETURN
Это ключевое слово вводит фразу RETURN, которая определяет тип данных значения, возвращаемого курсором. В фразе RETURN можно использовать атрибут %ROWTYPE, чтобы указать запись, представляющую строку таблицы базы данных. В фразе RETURN нельзя использовать атрибут %TYPE для представления типа данных переменной, константы или столбца базы данных.
Тело курсора должно содержать предложение SELECT и такую же фразу RETURN, как в соответствующей спецификации курсора. Более того, число и типы данных элементов списков SELECT в фразе RETURN должны совпадать.
имя_типа
Специфицирует тип данных результирующего значения, возвращаемого курсором. Для дополнительной информации см. раздел "Типы данных" в главе 2.
%TYPE
Атрибут %TYPE представляет тип данных переменной, константы или столбца базы данных.
таблица.столбец
Ссылается на таблицу и столбец в базе данных, которые должны быть доступны в момент обработки объявления.
таблица
Ссылается на таблицу в базе данных, которая должны быть доступна в момент обработки объявления.
%ROWTYPE
Атрибут %ROWTYPE определяет запись, представляющую строку таблицы базы данных. Столбцы в строке таблицы и соответствующие поля записи имеют одинаковые имена и типы данных.
select_предложение
Это - запрос, ассоциированный с ИМЕНЕМ_КУРСОРА, который возвращает множество значений. Синтаксис SELECT_ПРЕДЛОЖЕНИЯ совпадает с синтаксисом конструкта SELECT_INTO_ПРЕДЛОЖЕНИЕ, которое определено в разделе "SELECT INTO" ниже в этой главе, с той разницей, что SELECT_ПРЕДЛОЖЕНИЕ не может иметь фразы INTO.
Если объявление курсора определило параметры, каждый из этих параметров должен быть использован в SELECT_ПРЕДЛОЖЕНИИ.
Замечания по использованию
Ссылки вперед не допускаются в PL/SQL. Поэтому вы должны объявить курсор, прежде чем ссылаться на него в предложениях OPEN, FETCH или CLOSE. Кроме того, вы должны заранее объявить все переменные, на которые ссылаетесь в объявлении курсора. Для дополнительной информации см. раздел "Объявление курсора" в главе 4.
Нельзя присваивать значения курсору или использовать его имя в выражениях. Однако имена курсоров подчиняются тем же правилам сферы, что и имена переменных. Для дополнительной информации обратитесь к разделу "Сфера и видимость" в главе 2.
Слово SQL зарезервировано в PL/SQL как умалчиваемое имя для неявных курсоров ORACLE, и не может использоваться в объявлении курсора.
Вы извлекаете данные из курсора, сначала открыв его предложением OPEN, а затем выполняя для него предложение FETCH. Поскольку предложение FETCH специфицирует целевые переменные, использование фразы INTO в предложении SELECT в ОБЪЯВЛЕНИИ_КУРСОРА было бы избыточным, и считается незаконным.
Сфера параметров курсора локальна по отношению к этому курсору, что означает, что к ним можно обращаться лишь в запросе, используемом в определении курсора. Значения параметров курсора используются в ассоциированном запросе при открытии курсора. Запрос также может обращаться к другим переменным PL/SQL внутри их сферы. ТИП_ПАРАМЕТРА не может иметь ограничения. Например, вы должны специфицировать NUMBER, но не NUMBER(11,2).
Примеры
CURSOR c1 IS
SELECT ename, job, sal FROM emp WHERE deptno = 20;
CURSOR c2 (start_date DATE) IS
SELECT empno, sal FROM emp WHERE hiredate > start_date;
Связанные темы
CLOSE, FETCH, OPEN, SELECT INTO
Описание
Предложение DELETE удаляет целые строки данных из указанной таблицы или обзора. Для полного описания предложения DELETE обратитесь к документу ORACLE7 Server SQL Language Reference Manual.
Синтаксис
delete_предложение ::=
°°°°°°°°° DELETE °°° °°°°°°°°°° °°° ссылка_на_таблицу °° °°°°°°°°°° °
≤°° FROM °°╠ ≤° алиас °°╠
°°°°°°°°°°° °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° °°° ; °°°°
≤°°° WHERE °° °° условие_поиска °°°°°°°°°°°°°°°▄
≤°° CURRENT OF °°°° имя_курсора °°╠
где ССЫЛКА_НА_ТАБЛИЦУ имеет следующий синтаксис:
°°°°°°°°°°°° °°°°°°°°°° °°°°° ° таблица ° °°°°° °°°°°°°°°°°° °°°°°°°
≤° схема. °╠ ≤° обзор °°°╠ ≤° @связьБД °╠
Ключевые слова и параметры
ссылка_на_таблицу
Таблица (или обзор), специфицируемая ССЫЛКОЙ_НА_ТАБЛИЦУ, должна существовать в базе данных, с которой вы соединены во время выполнения предложения DELETE, и вы должны иметь привилегии DELETE.
алиас
Это другое (обычно краткое) имя таблицы или обзора; обычно используется в фразе WHERE.
WHERE условие_поиска
Этот параметр специфицирует условия выбора удаляемых строк из таблицы или обзора. Удаляются лишь те строки, которые удовлетворяют УСЛОВИЮ_ПОИСКА. Если УСЛОВИЕ_ПОИСКА опущено, будут удалены все строки таблицы или обзора.
WHERE CURRENT OF имя_курсора
Этот параметр ссылается на последнюю строку, обработанную предложением FETCH, ассоциированным с ИМЕНЕМ_КУРСОРА. Курсор должен быть заранее объявлен с фразой FOR UPDATE OF, и должен быть открыт и позиционирован на нужную строку. Если курсор не открыт, фраза CURRENT OF вызовет ошибку.
Замечания по использованию
PLSQL_ВЫРАЖЕНИЕ (за исключением выражений типа BOOLEAN) можно использовать в предложении DELETE всюду, где можно специфицировать литерал.
Предложение DELETE ... WHERE CURRENT OF ИМЯ_КУРСОРА можно использовать после выполнения FETCH на открытом курсоре (это включает и неявные операции FETCH, выполняемые в курсорном цикле FOR), при условии, что ассоциированный запрос был объявлен с фразой FOR UPDATE OF. Предложение DELETE ... WHERE CURRENT OF ИМЯ_КУРСОРА удаляет текущую, т.е. только что извлеченную, строку.
Неявный курсор SQL% и атрибуты курсора %NOTFOUND, %FOUND и %ROWCOUNT позволяют вам получать полезную информацию о выполнении предложения DELETE. Подробнее об этом см. в разделе "Управление курсорами" в главе 4.
Предложение DELETE может удалить одну или несколько строк, но может и не удалить ни одной строки. Если удалена хотя бы одна строка, происходит следующее:
Примеры
Следующее предложение удаляет из таблицы bonus всех сотрудников, жалованье которых меньше заданной квоты:
DELETE FROM bonus WHERE sales_amt < quota;
Описание
EXCEPTION_INIT назначает имя коду ошибки ORACLE. Это позволяет вам обращаться к внутренним исключениям по именам, вместо того чтобы использовать для всех них ключевое слово OTHER в обработчике исключений. Для дополнительной информации смотрите раздел "Использование EXCEPTION_INIT" в главе 5.
Синтаксис
exception_init_прагма ::= °° PRAGMA °° EXCEPTION_INIT (имя_исключения, номер_ошибки) °°°°°°;°°
Ключевые слова и параметры
PRAGMA
Это ключевое слово обозначает, что данное предложение является директивой компилятора, которое обрабатывается в период компиляции, а не в период исполнения. Прагма не влияет на смысл программы; она просто поставляет информацию компилятору.
имя_исключения
Этот параметр является именем исключения, объявленного ранее в ОБЪЯВЛЕНИИ_ИСКЛЮЧЕНИЯ.
номер_ошибки
НОМЕР_ОШИБКИ может быть любым действительным номером ошибки ORACLE. Это тот же код, который возвращает функция SQLCODE.
Замечания по использованию
Прагма EXCEPTION_INIT должна появляться в той же декларативной секции, что и соответствующее исключение, но после объявления самого исключения. Таким образом, прагма EXCEPTION_INIT может использоваться лишь в декларативной части блока PL/SQL, подпрограммы или пакета.
Любому коду ошибки может быть назначено лишь одно имя.
Пример
DECLARE
invalid_table EXCEPTION;
PRAGMA EXCEPTION_INIT(invalid_table, -942);
/* -942 - это код ошибки ORACLE, генерируемый при *
/* обращении к несуществующей таблице базы данных */
BEGIN
...
EXCEPTION
WHEN invalid_table THEN
-- обработать ошибку
...
END;
Связанные темы
Исключения, EXCEPTION_INIT, SQLCODE
Описание
Объявление исключения объявляет имя для определенного пользователем исключения. Когда исключение возбуждается (внутренне или через RAISE), нормальное выполнение блока PL/SQL останавливается, и выполняются предложения в соответствующем обработчике исключений. Когда обработчик завершается, управление возвращается во внешнее по отношению к блоку окружение. Для дополнительной информации см. главу 5.
Синтаксис
объявление_исключения ::=
°°°°°°°°° имя_исключения °°°°°° EXCEPTION °°°°°°° ; °°°°°°°°°°°°°°°°
обработчик_исключений ::=
╡°°°°°°°° OR °°°°°°°°≈
°°° WHEN °° °°°°° имя_исключения °≥°° ° THEN °°° ряд_предложений°°°
≤°°°°°°°°° OTHERS °°°°°°°°°╠
Ключевые слова и параметры
имя_исключения
Этот параметр является именем, которое вы даете исключению. Синтаксис ИМЕНИ_ИСКЛЮЧЕНИЯ совпадает с синтаксисом конструкта ИДЕНТИФИКАТОР. См. раздел "Идентификаторы" в главе 2.
WHEN
Вы можете заставить одну и ту же последовательность предложений обрабатывать несколько исключений, задав за словом WHEN список имен исключений и разделяя эти имена словом OR. При возбуждении любого исключения из этого списка будет выполнена ассоциированная последовательность предложений.
С каждой фразой WHEN можно ассоциировать собственный список исключений и собственную последовательность предложений. Однако имя любого исключения может появиться лишь один раз в части обработки исключений блока PL/SQL или подпрограммы.
OTHERS
OTHERS обозначает все остальные исключения, не перечисленные поименно в части обработки исключений блока. Слово OTHERS необязательно и допускается только в последнем обработчике исключений. Нельзя включать слово OTHERS в список исключений за ключевым словом WHEN.
ряд_предложений
Это последовательность предложений. См. раздел "Блоки" выше в этой главе.
Замечания по использованию
Объявление исключения может появляться только в декларативной части блока, подпрограммы или пакета. Правила сферы для исключений те же, что и для переменных. Заметим, однако, что исключения отличаются от переменных и констант тем, что их нельзя передавать как параметры подпрограммам.
Некоторые исключения являются предопределенными в PL/SQL. Перечень таких исключений приведен в разделе "Предопределенные исключения" в главе 5. PL/SQL объявляет предопределенные исключения глобально в пакете STANDARD, так что вам не требуется объявлять их. Переопределение предопределенных исключений чревато ошибками, так как ваше локальное объявление перекрывает глобальное объявление. В таких случаях вы должны использовать квалифицированную ссылку, чтобы сослаться на предопределенное исключение, например:
EXCEPTION
WHEN invalid_number OR STANDARD.INVALID_NUMBER THEN
...
Часть обработки исключений блока PL/SQL не обязательна.
Обработчики исключений, если есть, должны находиться в конце
блока. Они вводятся ключевым словом EXCEPTION. Часть обработки
исключений блока заканчивается тем же самым ключевым словом END,
которое завершает весь блок.
Исключение должно возбуждаться лишь в случае ошибки, которая делает невозможным или нежелательным продолжение обработки. Если в текущем блоке нет обработчика исключений для возбужденного исключения, то это исключение ПРОДВИГАЕТСЯ в окружающий блок согласно следующим правилам:
Обработчик исключений может обращаться лишь к тем переменным, которые доступны в текущем блоке.
Пример
DECLARE
bad_employee_num EXCEPTION;
bad_acct_num EXCEPTION;
...
BEGIN
...
EXCEPTION
-- пользовательские исключения
WHEN bad_employee_num OR bad_acct_num THEN
ROLLBACK;
-- предопределенное исключение
WHEN ZERO_DIVIDE THEN
INSERT INTO inventory_table VALUES (prod_name, quantity);
COMMIT;
END;
Связанные темы
Блоки, EXCEPTION_INIT, RAISE
Описание
Используйте предложение EXIT для выхода из цикла. Это предложение имеет две формы: безусловную (EXIT) и условную (EXIT WHEN). Обе формы позволяют указать имя цикла, из которого осуществляется выход. Для дополнительной информации см. раздел "Последовательное управление" в главе 3.
Синтаксис
exit_предложение ::=
°° EXIT °° °°°°°°°°°°°°°°° °° °°°°°°°°°°°°°°°°°°°°°°°°°°°° °° ; °°°°
≤°° имя_метки °°╠ ≤°° WHEN °°° plsql_условие °°╠
Ключевые слова и параметры
EXIT
Если опущены как ИМЯ_МЕТКИ, так и фраза WHEN, то осуществляется немедленный выход из текущего цикла. Выполнение продолжается с предложения, следующего за циклом.
имя_метки
Этот параметр идентифицирует цикл, из которого вы хотите выйти. Используя ИМЯ_МЕТКИ, вы можете выйти не только из текущего цикла, но из любого цикла, окружающего текущий цикл, при условии, что внешний цикл был поименован в окружающем LOOP_ПРЕДЛОЖЕНИИ.
plsql_условие
Этот параметр задает условие, которое вычисляется каждый раз, когда PL/SQL встречает это предложение EXIT при нормальном выполнении последовательности предложений цикла. Если результат вычисления PLSQL_УСЛОВИЕ есть TRUE, PL/SQL немедленно осуществляет выход из текущего (или указанного) цикла. Это эквивалентно следующему предложению:
IF plsql_условие THEN EXIT; END IF;
Синтаксис PLSQL_УСЛОВИЯ определен в разделе "Условия" выражения"
выше в этой главе.
Замечания по использованию
EXIT_ПРЕДЛОЖЕНИЕ может использоваться только внутри РЯДА_ПРЕДЛОЖЕНИЙ, содержащихся внутри LOOP_ПРЕДЛОЖЕНИЯ.
PL/SQL позволяет составлять бесконечные циклы. Например, цикл WHILE TRUE LOOP ... никогда не закончится нормальным образом. В таком случае вы ОБЯЗАНЫ использовать EXIT_ПРЕДЛОЖЕНИЕ, чтобы выйти из цикла.
Когда вы используете EXIT_ПРЕДЛОЖЕНИЕ для преждевременного выхода из курсорного цикла FOR, курсор закрывается автоматически. (Курсор также автоматически закрывается при возбуждении исключения внутри такого цикла.)
Пример
В следующем примере предложение EXIT НЕЗАКОННО, потому что нельзя выходить непосредственно из блока; вы можете выходить только из цикла.
DECLARE
amount NUMBER;
maximum NUMBER;
BEGIN
...
BEGIN
...
IF amount >= maximum THEN
EXIT;
END IF;
END;
...
END;
Следующий цикл нормально выполняется десять раз, но может выйти
и раньше, если обнаружит, что данных больше нет:
FOR i IN 1..10
LOOP
FETCH c1 INTO emp_rec;
EXIT WHEN c1%NOTFOUND;
total := total + emp_rec.comm;
END LOOP;
Следующий пример демонстрирует использование ИМЕНИ_МЕТКИ:
<>
FOR i IN 1..10 LOOP
...
<>
FOR j IN 1..100 LOOP
...
EXIT outer_loop WHEN ... ; -- выход из обоих циклов
END LOOP inner;
END LOOP outer;
Связанные темы
Условия, LOOP
Описание
Выражение - это комбинация переменных, констант, литералов и операторов. (В некоторых контекстах разрешается использовать также хост-переменные. Для дополнительной информации обратитесь к разделу "Использование хост-переменных" в главе 8.) Компилятор PL/SQL опрделяет тип данных выражения по типам переменных, констант, литералов и операторов, составляющих это выражение. Каждый раз, когда выражение вычисляется, оно дает результат этого типа. Для дополнительной информации см. раздел "Выражения и сравнения" в главе 2.
Синтаксис
plsql_выражение ::=
°°°°°°°°°°°°°°°°°°°°°°°° °° числовое_выражение °°°°° °°°°°°°°°°°°°°°
│°° символьное_выражение °°°▄
│°° календарное_выражение °°▄
≤°° булевское_выражение °°°°╠
числовое_выражение ::=
╡°°°°°°°°°°°°°°°°°°°°°°°°°°°° ° / ° °°°°°°°°°°°°°°°°°°≈
▀ │° * °▄ ▀
▀ │° - °▄ ▀
▀ ≤° + °╠ ▀
°°° °°°°° °°° °° числовой_литерал °°°°°°°°°°°° ° °°°°°°°°°°°°°°° ≥°
│° + °▄ │°° числовая_переменная °°°°°°°°°▄ ≤° **целое_выр °╠
≤° - °╠ │°° ссылка_на_хост_объект °°°°°°°▄
│°° числовая_функция °°°°°°°°°°°°▄
│°° NULL °°°°°°°°°°°°°°°°°°°°°°°°▄
│°° (числовое_выражение) °°°°°°°°▄
≤° ° имя_курсора ° ° %ROWCOUNT °°╠
≤° SQL °°°°°°°°°╠
символьное_выражение ::=
╡°°°°°°°°°°°°°° || °°°°°°°°°°°°°°°°≈
°°°°°°°°°°°°°°°°° °° символьный_литерал °°°°°° °°≥°°°°°°°°°°°°°°°°°
│°° символьная_переменная °°°▄
│°° ссылка_на_хост_объект °°°▄
│°° символьная_функция °°°°°°▄
│°° NULL °°°°°°°°°°°°°°°°°°°°▄
≤°° (символьное_выражение) °°╠
календарное_выражение ::=
°°°°°°°°°°°°°°°°°° °° календарный_литерал °°°°°° °°°°°°°°°°°°°°°°°°°
│°° календарная_переменная °°°▄
│°° ссылка_на_хост_объект °°°°▄
│°° календарная_функция °°°°°°▄
│°° NULL °°°°°°°°°°°°°°°°°°°°°▀
≤°° (календарное_выражение) °°╠
Ключевые слова и параметры
булевское_выражение
Этот параметр обозначает выражение, результат которого есть TRUE, FALSE или NULL. Синтаксис БУЛЕВСКОГО_ВЫРАЖЕНИЯ приведен в разделе "Условия" выше в этой главе.
Компоненты числового_выражения
числовой_литерал
Этот параметр обозначает числовой литерал, т.е. литерал, который можно неявно преобразовать в числовое значение.
числовая_переменная
Этот параметр обозначает имя ранее объявленной переменной или константы типа NUMBER, или типа, который можно неявно преобразовать в тип NUMBER.
ссылка_на_хост_объект
См. подраздел "Хост-объекты" ниже в этом разделе.
числовая_функция
Этот параметр обозначает вызов функции, возвращающей значение типа NUMBER или типа, который можно неявно преобразовать в тип NUMBER. Примерами могут служить функции ABS, SQRT или LENGTH.
NULL
Ключевое слово NULL представляет пустое значение. Если такое значение используется в ЧИСЛОВОМ_ВЫРАЖЕНИИ, результатом всегда будет значение NULL.
целое_выр
Этот параметр представляет выражение с целым значением.
+, -
Символы плюс (+) и минус (-) являются унарными операторами, если они являются первыми символами в ЧИСЛОВОМ_ВЫРАЖЕНИИ. Символ + не имеет никакого эффекта. Символ минус инвертирует знак результирующего значения ЧИСЛОВОГО_ВЫРАЖЕНИЯ. При использовании внутри ЧИСЛОВОГО_ВЫРАЖЕНИЯ символы плюс и минус являются соответственно операторами сложения и вычитания.
/, *, **
Символы /, * и ** обозначают соответственно операторы деления, умножения и возведения в степень.
Компоненты символьного_выражения
символьный_литерал
Этот параметр обозначает любой действительный строковый литерал. Определение СТРОКОВОГО_ЛИТЕРАЛА приведено в разделе "Литералы" ниже в этой главе.
символьная_переменная
Этот параметр обозначает имя ранее объявленной строковой переменной или константы. Для дополнительной информации обратитесь к разделу "Переменные и константы" ниже в этой главе.
ссылка_на_хост_объект
См. подраздел "Хост-объекты" ниже в этом разделе.
символьная_функция
Этот параметр обозначает вызов функции, возвращающей значение типа CHAR. Примерами могут служить функции UPPER() и SQLERRM().
||
Символ || обозначает оператор конкатенации. Результатом конкатенации строки1 и строки2 является строка символов, содержащая из символов строки1, за которыми следуют символы строки2. Пример:
'Good' || ' Morning.' дает результат 'Good Morning.'
NULL
Ключевое слово NULL представляет пустое значение. В операции конкатенации значение NULL не оказывает влияния на результат, как показывает следующий пример:
'suit' || NULL || 'case' дает результат 'suitcase'
Символьная строка нулевой длины ('') называется ПУСТОЙ СТРОКОЙ и
трактуется как пустое значение:
'suit' || '' || 'case' дает результат 'suitcase'
Компоненты календарного_выражения
календарный_литерал
Этот параметр задает строковый литерал, содержащий правильную дату. Определение СТРОКОВОГО_ЛИТЕРАЛА приведено в разделе "Литералы" ниже в этой главе. Два примера:
'09-JUL-59' '09-DEC-77'
календарная_переменная
Этот параметр обозначает имя ранее объявленной переменной или константы типа DATE, или типа, который можно неявно преобразовать в тип DATE.
ссылка_на_хост_объект
См. следующий подраздел, "Хост-объекты".
календарная_функция
Этот параметр обозначает вызов функции, возвращающей значение типа DATE или типа, который можно неявно преобразовать в тип DATE. Примерами могут служить функции TO_DATE, LAST_DAY или NEXT_DAY.
NULL
Ключевое слово NULL представляет пустое значение. Если такое значение используется в КАЛЕНДАРНОМ_ВЫРАЖЕНИИ, результатом всегда будет NULL.
Хост-объекты
Объекты из внешнего (хост-) окружения называются ХОСТ-ОБЪЕКТАМИ. Например, в среде встроенного PL/SQL ХОСТ-ПЕРЕМЕННОЙ называется переменная, объявленная в хост-языке. ПОЛЕ ФОРМЫ в среде SQL*Forms представляет собой еще один пример хост-объекта. Для дополнительной информации о хост-переменных обратитесь к главе 8. Синтаксис ССЫЛКИ_НА_ХОСТ_ОБЪЕКТ имеет следующий вид:
ссылка_на_хост_объект ::=
°°°°°°°°° °° :числовой_хост_объект °°°°° °°° °°°°°°°°°°°°°°°° °°°°°°
│°° :символьный_хост_объект °°°▄ ≤°° :индикатор °°╠
≤°° :календарный_хост_объект °°╠
:числовой хост_объект
Этот параметр обозначает имя ранее объявленного объекта типа
NUMBER, или типа, который можно неявно преобразовать в тип
NUMBER.
:символьный хост_объект
Этот параметр обозначает имя ранее объявленного объекта типа
CHAR, или типа, который можно неявно преобразовать в тип CHAR.
:календарный хост_объект
Этот параметр обозначает имя ранее объявленного объекта типа
DATE, или типа, который можно неявно преобразовать в тип DATE.
(Например, это может быть объект типа CHAR в умалчиваемом
формате даты 'DD-MON-YY'.)
:индикатор
Этот параметр обозначает индикатор значения или состояния
хост-переменной. Например, в среде встроенного PL/SQL
целочисленная ИНДИКАТОРНАЯ ПЕРЕМЕННАЯ используется для
присваивания пустых значений входным хост-переменным и для
индикации пустых или усеченных значений выходных
хост-переменных. Для дополнительной информации об индикаторных
переменных обратитесь к главе 8.
Замечания по использованию
Все операции выполняются согласно их предопределенному порядку старшинства. Этот порядок, по убыванию старшинства, следующий:
Если скобки окружают выражение, являющееся частью большего выражения, то выражение в скобках вычисляется первым. Затем результат используется как единственное значение в большем выражении.
В PLSQL_ВЫРАЖЕНИИ разрешается использовать лишь значения с типами данных, совместимыми друг с другом или преобразуемыми друг в друга. Для дополнительной информации обратитесь к разделу "Преобразования типов данных" в главе 2.
Примеры
5.0 -- числовое_выражение с числовым_литералом
6 + b*4 -- числовое_выражение
'JONES' -- символьное_выражение с символьным_литералом
'FAT' || 'CATS' -- символьное_выражение с конкатенацией
last_name -- символьное_выражение с символьной_переменной
'26-NOV-65' -- календарное_выражение (строковый литерал)
Связанные темы
Предложение присваивания, Условия, Константы и переменные
Описание
Предложение FETCH извлекает очередную строку данных из активного множества (т.е. множества строк, которые удовлетворяют запросу, ассоциированному с курсором). Извлекаемые данные записываются в переменные, которые соответствуют столбцам, выбираемым запросом.
Синтаксис
fetch_предложение ::=
╡°°°°°°°° , °°°°°°°°≈
°° FETCH °°° имя_курсора °°° INTO °° °°° имя_переменной °≥° °° ; °°
≤°°°° имя_записи °°°°°°°╠
Ключевые слова и параметры
имя_курсора
Этот параметр является именем явно объявленного и заранее открытого курсора. Соглашения об именах приведены в разделе "Идентификаторы" в главе 2.
INTO имя_переменной
INTO ИМЯ_ПЕРЕМЕННОЙ определяет скалярные переменные, в которые будут записаны извлеченные данные. Все переменные в списке ИМЕН_ПЕРЕМЕННЫХ должны быть заранее объявлены.
Для каждого столбца, возвращаемого запросом, который ассоциирован с курсором, должна быть специфицирована соответствующая переменная в списке ИМЕН_ПЕРЕМЕННЫХ. Кроме того, типы данных столбцов, возвращаемых запросом, должны быть совместимыми с типами соответствующих переменных (или преобразуемыми в эти типы). Для дополнительной информации обратитесь к разделу "Преобразования типов данных" в главе 2.
INTO имя_записи
Этот параметр указывает, что извлекаемые данные должны быть помещены в переменную-запись, объявленную с атрибутом %ROWTYPE, как показывает следующий пример:
DECLARE
CURSOR c1 IS SELECT ename, empno FROM emp;
emp_rec c1%ROWTYPE;
...
BEGIN
OPEN c1;
...
LOOP
FETCH c1 INTO emp_rec;
EXIT WHEN c1%NOTFOUND;
...
END LOOP;
CLOSE c1;
END;
После этого вы можете обращаться к извлеченным данным каждого
столбца через конструкт ИМЯ_ЗАПИСИ.ИМЯ_СТОЛБЦА. Например,
c1.ename адресует данные, возвращенные из столбца ENAME.
Замечания по использованию
В PL/SQL, предложение SELECT INTO должно возвращать ровно одну строку данных. Если это предложение не возвращает ни одной строки, возбуждается предопределенное исключение NO_DATA_FOUND. Если оно возвращает более одной строки, возбуждается предопределенное исключение TOO_MANY_ROWS. Для обработки многострочных запросов вы должны использовать не предложение SELECT INTO, а курсорный цикл FOR или предложение FETCH.
FETCH обычно используется со следующей логикой:
...
OPEN my_cursor;
...
LOOP
FETCH my_cursor INTO my_record;
EXIT WHEN my_cursor%NOTFOUND;
...
-- обработать извлеченные данные
...
END LOOP;
Все выражения в фразе WHERE запроса, ассоциированного с
курсором, вычисляются лишь в момент открытия курсора, как
показывает следующий пример:
DECLARE
multiplied_sal NUMBER(10);
multiplier NUMBER(10) := 2;
CURSOR my_cursor IS SELECT multiplier*sal FROM emp;
BEGIN
OPEN my_cursor; -- здесь multiplier равен 2
LOOP
FETCH my_cursor INTO multiplied_sal;
EXIT WHEN my_cursor%NOTFOUND;
...
-- обработать извлеченные данные
...
multiplier := multiplier + 1;
/* Это не влияет на FETCH. sal по-прежнему *
* будет умножаться на 2. */
END LOOP;
END;
Несмотря на то, что multiplier наращивается после каждой
операции FETCH, извлекаться будет всегда значение 2*SAL, потому
что курсор был открыт при значении multiplier, равном 2. Чтобы
изменить активное множество или значения выражений в запросе, вы
должны закрыть и заново открыть курсор с новыми значениями
входных переменных (в данном случае, multiplier).
Однако, вы можете ассоциировать с операцией FETCH несколько списков ИМЕН_ПЕРЕМЕННЫХ или несколько ИМЕН_ЗАПИСЕЙ. Например, после первой операции FETCH вы можете выполнить очередную операцию FETCH на том же курсоре, но с другим списком имен переменных. На самом деле, каждая FETCH может использовать свой список имен переменных, как показывает следующий пример:
DECLARE
CURSOR my_cursor IS SELECT ename FROM emp;
var1 emp.ename%TYPE;
var2 emp.ename%TYPE;
var3 emp.ename%TYPE;
BEGIN
OPEN my_cursor;
FETCH my_cursor INTO var1; -- извлекает первую строку
FETCH my_cursor INTO var2; -- извлекает вторую строку
FETCH my_cursor INTO var3; -- извлекает третью строку
...
CLOSE my_cursor;
END;
Если вы выполняете FETCH, но в активном множестве больше нет
строк, атрибут %NOTFOUND для этого курсора устанавливается в
TRUE. В этот момент значения INTO-переменных не определены.
Обычно вы можете использовать курсорный цикл FOR вместо того, чтобы явно открывать курсор, использовать FETCH и закрывать курсор.
Связанные темы
Предложение присваивания, CLOSE, Курсоры, LOOP, %NOTFOUND, OPEN, %ROWTYPE, SELECT INTO
Описание
Курсоры PL/SQL имеют четыре атрибута, включая %FOUND. Эти атрибуты, присоединяемые к имени курсора, помогают обращаться к полезной информации курсора. Для дополнительной информации см. раздел "Управление курсорами" в главе 4.
PL/SQL использует два типа курсоров: явные и неявные. PL/SQL неявно объявляет курсор (с именем SQL) для любого предложения манипулирования данными SQL, включая однострочные запросы. Перед выполнением первого предложения SQL, не ассоциированного с явным курсором, SQL%FOUND дает NULL. Впоследствии, этот атрибут дает TRUE, если операция INSERT, UPDATE или DELETE затронула хотя бы одну строку, или если операция SELECT INTO вернула хотя бы одну строку. В противном случае SQL%FOUND дает FALSE.
В случае многострочных предложений SELECT вы можете явно объявить курсор для обработки возвращаемых строк. После открытия курсора, но до выполнения первой операции FETCH, атрибут ИМЯ_КУРСОРА%FOUND дает NULL. После каждой операции FETCH этот атрибут дает TRUE, если операция вернула очередную строку данных, и FALSE в противном случае.
Синтаксис
атрибут_%found ::= °°°°°°°°°°°°°°°°°°°°° имя_курсора%FOUND °°°°°°°°°°°°°°°°°°°°°°°°°°°°
Ключевые слова и параметры
имя_курсора
Этот параметр должен быть именем явно объявленного курсора или именем неявного курсора (SQL).
Замечания по использованию
Атрибут %FOUND можно использовать в процедурных предложениях, но НЕ в предложениях SQL. Атрибут %FOUND ассоциирован с каждым явным курсором. Вы можете открыть одновременно несколько курсоров и в каждый момент времени знать, какие из них еще имеют доступные строки в их активных множествах. Если курсор не открыт, то обращение к нему через атрибут %FOUND возбуждает предопределенное исключение INVALID_CURSOR.
Когда явный курсор открыт, строки базы данных, удовлетворяющие запросу этого курсора, идентифицированы и образуют активное множество. Каждая операция FETCH возвращает очередную строку из активного множества. Атрибут %FOUND указывает, была ли возвращена строка последней операцией FETCH для соответствующего открытого курсора. Когда активное множество становится пустым (так может оказаться и перед первой операцией FETCH), очередная операция FETCH устанавливает атрибут %FOUND в FALSE.
Примеры
В следующем примере, блок PL/SQL извлекает по одному числу из каждой из двух таблиц и вставляет их сумму в третью таблицу. Блок завершает свою работу по исчерпании любой из первых двух таблиц.
-- доступен на диске в файле EXAMP12
DECLARE
CURSOR num1_cur IS SELECT num FROM num1_tab
ORDER BY sequence;
CURSOR num2_cur IS SELECT num FROM num2_tab
ORDER BY sequence;
num1 num1_tab.num%TYPE;
num2 num2_tab.num%TYPE;
pair_num NUMBER := 0;
BEGIN
OPEN num1_cur;
OPEN num2_cur;
LOOP -- loop through the two tables and get
-- pairs of numbers
FETCH num1_cur INTO num1;
FETCH num2_cur INTO num2;
IF (num1_cur%FOUND) AND (num2_cur%FOUND) THEN
pair_num := pair_num + 1;
INSERT INTO sum_tab VALUES (pair_num, num1 + num2);
ELSE
EXIT;
END IF;
END LOOP;
CLOSE num1_cur;
CLOSE num2_cur;
END;
В следующем примере, %FOUND используется, чтобы выполнить
операцию INSERT при успешном выполнении операции UPDATE:
UPDATE emp SET sal = sal * 1.1 WHERE ename = my_ename;
IF SQL%FOUND THEN
INSERT INTO bonus_amts VALUES (my_deptno, my_ename, my_sal);
END IF;
Связанные темы
CLOSE, Курсоры, DELETE, FETCH, INSERT, %NOTFOUND, OPEN, SELECT INTO, UPDATE
Описание
Функция - это поименованная программная единица, которая принимает параметры и возвращает вычисленное значение. Для дополнительной информации обратитесь к разделу "Функции" в главе 6.
Функция имеет две части: спецификацию и тело. Спецификация функции начинается ключевым словом FUNCTION и заканчивается фразой RETURN, которая специфицирует тип данных результирующего значения. Объявления аргументов необязательны. Функции, не принимающие аргументов, записываются без скобок.
Тело функции начинается ключевым словом IS и заканчивается ключевым словом END, за которым может следовать необязательное имя функции. Тело функции имеет три части: декларативную часть, исполняемую часть и необязательную часть обработки исключений.
Декларативная часть содержит объявления типов, курсоров, констант, переменных, исключений и подпрограмм. Эти объекты локальны и перестают существовать при выходе из функции. Исполняемая часть содержит предложения, которые присваивают значения, управляют выполнением и манипулируют данными ORACLE. Часть обработки исключений содержит обработчики исключений, которые имеют дело с исключениями, возбуждаемыми во время выполнения функции.
Синтаксис
спецификация_функции ::=
°°°°° FUNCTION °°° имя_функции °°°° °°°°°°°°°°°°°°°°°°°°°°°°°° °°°°°°
▀ ╡°°°° , °°°°°≈ ▀
≤°° ( °° аргумент °≥° ) °°╠
°°°°°°°° RETURN °°°°°°°°°°° ° имя_типа °°°°°°°°°°°°° °°°°° ; °°°°°°°
│° переменная%TYPE °°°°°°▄
│° таблица.столбец%TYPE °▄
≤° таблица%ROWTYPE °°°°°°╠
объявление_функции ::= тело_функции
тело_функции ::=
°°°°° FUNCTION °°° имя_функции °°°° °°°°°°°°°°°°°°°°°°°°°°°°°° °°°°°°
▀ ╡°°°° , °°°°°≈ ▀
≤°° ( °° аргумент °≥° ) °°╠
°°°°°°°° RETURN °°°°°°°°°°° ° имя_типа °°°°°°°°°°°°° °°°°° IS °°°°°°°
│° переменная%TYPE °°°°°°▄
│° таблица.столбец%TYPE °▄
≤° таблица%ROWTYPE °°°°°°╠
°°°°°°°°°°°°°° °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° °°°°°°°°°°°
▀ ╡°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°≈ ▀
≤°°° °° объявление_переменной; °°°° °°°≥°°╠
│°° объявление_курсора; °°°°°°°▄
│°° объявление_исключения; °°°°▄
│°° объявление_записи; °°°°°°°°▄
│°° объявление_plsql_таблицы; °▄
│°° объявление_процедуры; °°°°°▄
≤°° объявление_функции; °°°°°°°╠
°°°°°°°°°°°°°°°°°°°°°° BEGIN °°°°° ряд_предложений °°°°°°°°°°°°°°°°°°
°°°°° °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° °°°°°°°°°°°°°°°
▀ ╡°°°°°°°°°°°°°°°°°°°°°°°°°°°°≈ ▀
≤°° EXCEPTION °°°°° обработчик_исключений; °°≥°°╠
°°°°°°°°°°°°°°°°°°° END °°°°°°° °°°°°°°°°°°°°°°°° °°°° ; °°°°°°°°°°°
≤°° имя_функции °°╠
где АРГУМЕНТ имеет следующий синтаксис:
°°°° имя_аргумента °° °°°°°°°°°°° °°° ° имя_типа °°°°°°°°°°°°° °°°°°°
│° IN °°°°°°▄ │° переменная%TYPE °°°°°°▄
│° OUT °°°°°▄ │° таблица.столбец%TYPE °▄
≤° IN OUT °°╠ ≤° таблица%ROWTYPE °°°°°°╠
°°°°°°°°°°°°°°°° °°°°°°°°°°°°°°°°°°°°°°°°°°°° °°°°°°°°°°°°°°°°°°°°°°
│°°°°° := °°°°° °° значение °╠
≤°° DEFAULT °°°╠
Ключевые слова и параметры
имя_функции
Этот идентификатор именует функцию. Соглашения об именах описаны в разделе "Идентификаторы" в главе 2.
имя_аргумента
Этот идентификатор именует формальный параметр и представляет собой переменную, объявленную в спецификации функции и адресуемую в теле функции. Соглашения об именах описаны в разделе "Идентификаторы" в главе 2.
RETURN
Это ключевое слово вводит фразу RETURN, специфицирующую тип данных результирующего значения.
имя_типа
Специфицирует тип данных формального параметра или результирующего значения. Для дополнительной информации см. раздел "Типы данных" в главе 2.
В отличие от спецификатора типа в объявлении переменной, спецификатор типа в объявлении аргумента не может иметь ограничения. Например, следующее объявление acct_id незаконно:
FUNCTION ... (acct_id INTEGER(5)) ... IS -- незаконно
BEGIN ... END;
таблица.столбец
Ссылка на таблицу и столбец базы данных, которые должны быть доступны в момент обработки объявления.
%TYPE
Атрибут %TYPE представляет тип данных переменной, константы или столбца базы данных.
таблица
Ссылка на таблицу базы данных, которая должна быть доступна в момент обработки объявления.
%ROWTYPE
Атрибут %ROWTYPE указывает запись, представляющую строку таблицы базы данных. Столбцы в строке и соответствующие поля записи имеют одинаковые имена и типы данных.
объявление_переменной
Этот конструкт объявляет переменные и константы. Его синтаксис описан в разделе "Переменные и константы" ниже в этой главе.
объявление_курсора
Этот конструкт объявляет явный курсор. Его синтаксис описан в разделе "Курсоры" выше в этой главе.
объявление_исключения
Этот конструкт объявляет исключения. Его синтаксис описан в разделе "Исключения" выше в этой главе.
объявление_записи
Этот конструкт объявляет пользовательские записи. Его синтаксис описан в разделе "Записи" ниже в этой главе.
объявление_plsql_таблицы
Этот конструкт объявляет таблицы PL/SQL. Его синтаксис описан в разделе "Таблицы PL/SQL" ниже в этой главе.
объявление_процедуры
Этот конструкт объявляет процедуру. Его синтаксис описан в разделе "Процедуры" ниже в этой главе.
объявление_функции
Этот конструкт объявляет вложенную функцию.
ряд_предложений
Это последовательность предложений. Ее синтаксис описан в разделе "Блоки" выше в этой главе.
обработчик_исключений
Этот конструкт ассоциирует исключение с последовательностью предложений, которая будет выполняться при возбуждении исключения. Синтаксис ОБРАБОТЧИКА_ИСКЛЮЧЕНИЙ описан в разделе "Исключения" выше в этой главе.
IN, OUT, IN OUT
Эти моды параметров определяют поведение формальных параметров. Мода IN позволяет передавать значения вызываемой подпрограмме. Мода OUT позволяет возвращать значения вызывающей программе. Мода IN OUT позволяет передавать входные значения вызываемой подпрограмме и возвращать обновленные значения вызывающей программе.
DEFAULT или :=
Это ключевое слово или оператор присваивания позволяют вам инициализировать параметры IN умалчиваемыми значениями.
Замечания по использованию
Каждая функция должна содержать хотя бы одно предложение RETURN. В противном случае PL/SQL возбудит предопределенное исключение PROGRAM_ERROR во время выполнения.
Функция вызывается как часть выражения. Например, функция sal_ok может быть вызвана следующим образом:
promotable := sal_ok(new_sal, new_title) AND (rating > 3);
Идентификатор функции трактуется как выражение, возвращающее
результат.
Внутри функции параметр IN выступает как константа. Поэтому ему нельзя присвоить значение. Параметр OUT выступает как неинициализированная переменная. Поэтому его значение нельзя присваивать другим переменным или переприсвоить самому себе. Параметр IN OUT выступает как инициализированная переменная. Поэтому ему можно присвоить значение, а его значение можно присваивать другим переменным. Сводка информации о модах параметров приведена в табл.6-1 в главе 6.
Избегайте использования моды OUT или IN OUT в функциях. Назначение функции - принять нуль или более аргументов и возвратить единственное значение. Возврат функцией нескольких результирующих значений является плохой практикой программирования. Кроме того, функции должны быть свободны от ПОБОЧНЫХ ЭФФЕКТОВ, то есть не должны изменять значений переменных, не локальных для данной функции. Так, функция не должна изменять значений своих фактических параметров.
Вы можете написать спецификацию функции и ее тело как единицу. Альтернативно, вы можете отделить спецификацию функции от ее тела. Таким способом вы можете скрыть детали реализации, помещая функцию в пакет.
Вы можете определять функции в теле пакета, не объявляя их спецификаций в спецификации пакета. Однако такие функции можно будет вызывать только изнутри пакета.
Функции можно определять с помощью любого инструмента ORACLE, поддерживающего PL/SQL. Однако, для того, чтобы быть доступными для общего пользования, функции необходимо создавать (CREATE) и сохранять в базе данных ORACLE.
Вы можете выдавать предложение CREATE FUNCTION интерактивно из SQL*Plus или SQL*DBA. Полный синтаксис предложения CREATE FUNCTION приведен в документе SQL Language Reference Manual.
Связанные темы
Курсоры, Исключения, Пакеты, Таблицы PL/SQL, Процедуры, Записи
Пример
Следующая функция возвращает баланс указанного банковского счета:
FUNCTION balance (acct_id INTEGER) RETURN REAL IS
acct_bal REAL;
BEGIN
SELECT bal INTO acct_bal FROM accts WHERE acctno = acct_id;
RETURN acct_bal;
END balance;
Описание
Предложение GOTO безусловно передает управление с текущего предложения на выполнимое предложение или блок PL/SQL. Метка должна быть уникальна в своей сфере, и должна непосредственно предшествовать предложению (или блоку), на которое вы хотите передать управление. GOTO передает управление на предложение, следующее за <<ИМЕНЕМ_МЕТКИ>>, либо в текущем блоке, либо в первом из окружающих блоков, в котором найдется такое ИМЯ_МЕТКИ. Для дополнительной информации см. раздел "Последовательное управление" в главе 3.
Синтаксис
объявление_имени_метки ::= °°°°°°°°°°°°°°°° << °°°° имя_метки °°°° >> °°°°°°°°°°°°°°°°°°°°°°°°° goto_предложение ::= °°°°°°°°°°°°°°°° GOTO °°°° имя_метки °°°° ; °°°°°°°°°°°°°°°°°°°°°°°°
Ключевые слова и параметры
имя_метки
Это необъявляемый идентификатор, помещающий предложение или блок, на который вы хотите передать управление. Синтаксис ИМЕНИ_МЕТКИ совпадает с синтаксисом ИДЕНТИФИКАТОРА, определенным в разделе "Идентификаторы" в главе 2.
Вы используете ИМЯ_МЕТКИ в GOTO_ПРЕДЛОЖЕНИИ, чтобы передать управление на предложение (или блок), следующее за конструктом <<ИМЯ_МЕТКИ>>. Для дополнительной информации об ИМЕНИ_МЕТКИ обратитесь к разделу "Блоки" выше в этой главе.
Замечания по использованию
Некоторые возможные назначения предложения GOTO незаконны. В частности, предложение GOTO не может передавать управление в предложение IF, в предложение LOOP или в подблок. Например, следующее предложение GOTO незаконно:
BEGIN
...
GOTO update_row; -- незаконный переход в предложение IF
...
IF valid THEN
...
<>
UPDATE emp SET ...
END IF;
END;
Из текущего блока предложение GOTO может перейти в другое место
блока или в окружающий блок, но не в обработчик исключений. Из
обработчика исключений, GOTO_ПРЕДЛОЖЕНИЕ может перейти в
окружающий блок, но не в текущий блок.
Если вы используете GOTO_ПРЕДЛОЖЕНИЕ для выхода из курсорного цикла FOR, то курсор автоматически закрывается. (Курсор также автоматически закрывается при возбуждении исключения внутри такого цикла.)
Данное ИМЯ_МЕТКИ может появиться в блоке ровно один раз, хотя оно может появляться в других блоках, включая окружающие блоки и подблоки. GOTO_ПРЕДЛОЖЕНИЕ передает управление на предложение, следующее за <<ИМЕНЕМ_МЕТКИ>>, либо в текущем блоке, либо в первом из окружающих блоков, в котором найдется такое ИМЯ_МЕТКИ.
Примеры
Предложение GOTO нельзя использовать для перехода на любое ключевое слово. Оно должно передавать управление на выполняемое предложение или блок. Например, следующая передача управления незаконна:
BEGIN
...
FOR ctr IN 1..50 LOOP
DELETE FROM emp WHERE ...
IF SQL%FOUND THEN
GOTO end_loop;
END IF;
...
<>
END LOOP; -- не является выполняемым предложением
END;
Чтобы исправить последний пример, достаточно добавить
предложение NULL:
BEGIN
...
FOR ctr IN 1..50 LOOP
DELETE FROM emp WHERE ...
IF SQL%FOUND THEN
GOTO end_loop;
END IF;
...
<>
NULL; -- выполняемое предложение, ничего не делающее
END LOOP;
END;
Нельзя переходить внутрь предложения IF, так что следующая
передача управления незаконна:
BEGIN
...
GOTO my_label; -- незаконно
IF a > b THEN
b := b - c;
<>
x := x + 1;
END IF;
END;
Для дополнительных примеров допустимых и недопустимых применений
предложения GOTO обратитесь к разделу "Последовательное
управление" в главе 3.
Описание
Предложение IF выполняет последовательность предложений, если удовлетворено заданное условие. Для дополнительной информации см. раздел "Условное управление" в главе 3.
Синтаксис
if_предложение ::=
°°°°° IF °°°° plsql_условие °°°° THEN °°°° ряд_предложений °°°°°°°°°°
°°° °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° °°
▀ ╡°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°≈ ▀
≤°°° ELSIF °°° plsql_условие °°°° THEN °°°° ряд_предложений °≥°╠
°°° °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° °°° END IF; °°°°°°°°°°°°°°°°°°°°°
≤°° ELSE °°°° ряд_предложений °°╠
Ключевые слова и параметры
plsql_условие
Это условие, ассоциируемое с последовательностью предложений, которая будет выполняться лишь при истинности данного условия. Синтаксис PLSQL_УСЛОВИЯ приведен в разделе "Условия" выше в этой главе.
ряд_предложений
Этот параметр представляет последовательность предложений. Синтаксис РЯДА_ПРЕДЛОЖЕНИЙ определен в разделе "Блоки" выше в этой главе.
THEN
Это ключевое слово ассоциирует условие, стоящее перед THEN, с РЯДОМ_ПРЕДЛОЖЕНИЙ, следующим за THEN. А именно, если вычисление условия дает TRUE, то РЯД_ПРЕДЛОЖЕНИЙ выполняется.
ELSIF
Это ключевое слово вводит новое условие, которое будет вычисляться, если все предыдущие условия (т.е. условие после начального IF и все условия, ассоциированные с предыдущими ELSIF) дают FALSE или NULL.
ELSE
За ключевым словом ELSE не следует никакого условия. Если управление достигает ELSE, то выполняется следующий за ELSE РЯД_ПРЕДЛОЖЕНИЙ.
Замечания по использованию
Есть три формы предложений IF: IF-THEN, IF-THEN-ELSE и IF-THEN-ELSIF. Простейшая форма предложения IF ассоциирует условие с последовательностью предложений, окружаемой ключевыми словами THEN и END IF. Эта последовательность предложений выполняется, только если условие дает TRUE. Если условие дает FALSE или NULL, то предложение IF ничего не делает. В любом случае, управление передается на следующее предложение.
Вторая форма предложения IF добавляет ключевое слово ELSE, за которым следует альтернативная последовательность предложений. Последовательность предложений в фразе ELSE выполняется, только если условие дает FALSE или NULL. Таким образом, фраза ELSE гарантирует, что одна из последовательностей предложений будет выполнена.
Третья форма предложения IF использует ключевое слово ELSIF, чтобы ввести дополнительные условия. Если первое условие дает FALSE или NULL, фраза ELSIF проверяет следующее условие. В предложении IF может быть сколько угодно фраз ELSIF; последняя фраза ELSE необязательна. Условия вычисляются по одному сверху вниз. Если любое условие даст TRUE, выполняется соответствующая последовательность предложений, и управление передается на следующее за IF предложение (без вычисления оставшихся условий). Если все условия дадут FALSE или NULL, выполняется последовательность предложений в фразе ELSE, если она есть.
Так как обработка предложения IF завершается после выполнения РЯДА_ПРЕДЛОЖЕНИЙ, только один РЯД_ПРЕДЛОЖЕНИЙ может быть выполнен предложением IF.
Фразы THEN и ELSE могут включать предложения IF. Иными словами, предложения IF можно вкладывать друг в друга.
Примеры
В следующем примере, если shoe_count имеет значение 10, оба условия, специфицированные в предложении IF, истинны. Однако, поскольку обработка предложения IF заканчивается после установления истинности первого условия и выполнения соответствующего РЯДА_ПРЕДЛОЖЕНИЙ, переменной order_quantity будет правильно присвоено значение 50. Условие, ассоциированное с ELSIF, не вычисляется, и работа продолжится с предложения INSERT.
IF shoe_count < 20 THEN
order_amt := 50;
ELSIF shoe_count < 30 THEN
order_amt := 20;
ELSE
order_amt := 5;
END IF;
INSERT INTO purchase_order VALUES (shoe_type, order_quantity);
В следующем примере, в зависимости от значения score, в таблицу
grades вставляется одно из трех сообщений состояния:
IF score < 70 THEN
fail := fail + 1;
INSERT INTO grades VALUES (student_id, 'Failed');
ELSIF score IS NULL THEN
INSERT INTO grades VALUES (student_id, 'Unknown');
ELSE
pass := pass + 1;
INSERT INTO grades VALUES (student_id, 'Passed');
END IF;
Связанные темы
Условия
Описание
Предложение INSERT добавляет новые строки данных в таблицу или обзор в базе данных. Для полного описания предложения INSERT обратитесь к документу ORACLE7 Server SQL Language Reference Manual.
Синтаксис
insert_предложение ::=
°° INSERT °° INTO °° ссылка_на_таблицу ° °°°°°°°°°°°°°°°°°°°°°°°°° °°
▀ ╡°°°°°° , °°°°°°≈ ▀
≤° ( °° имя_столбца °≥°)°╠
╡°°°°°°°° , °°°°°°°°≈
°°°°°°°°° °° VALUES °°°° ( °°° sql_выражение °°≥°° ) °°° °°° ; °°°°°
≤°°°°°°°°°°°°° select_предложение °°°°°°°°°°°°°°╠
где ССЫЛКА_НА_ТАБЛИЦУ имеет следующий синтаксис:
°°°°°°°°°°°° °°°°°°°°°° °°°°° ° таблица ° °°°°° °°°°°°°°°°°° °°°°°°°
≤° схема. °╠ ≤° обзор °°°╠ ≤° @связьБД °╠
Ключевые слова и параметры
ссылка_на_таблицу
Идентификатор ССЫЛКА_НА_ТАБЛИЦУ задает имя таблицы (или обзора), в которую вы хотите вставить данные. Таблица должна существовать в базе данных, к которой вы присоединены во время выполнения предложения INSERT, и вы должны иметь привилегии INSERT.
имя_столбца
Этот параметр определяет столбец, в который будут вставляться данные. Одно и то же имя столбца не может быть специфицировано больше одного раза в списке ИМЕН_СТОЛБЦОВ. Имена столбцов не обязаны задаваться в том порядке, в каком они были определены в таблице или обзоре (в CREATE TABLE или CREATE VIEW). Если вы объявляете список ИМЕН_СТОЛБЦОВ, включающий не все столбцы таблицы, то значения не включенных столбцов будут установлены в NULL или в умалчиваемые значения, которые были специфицированы в предложении CREATE TABLE.
VALUES (sql_выражение, ...)
Присваивает значения одного или нескольких SQL_ВЫРАЖЕНИЙ, заданных в списке значений, соответствующим столбцам из списка ИМЕН_СТОЛБЦОВ. Если список ИМЕН_СТОЛБЦОВ отсутствует, то значения SQL_ВЫРАЖЕНИЙ присваиваются столбцам таблицы в том порядке, в каком они были определены в предложении CREATE TABLE при создании таблицы. Конструкт SQL_ВЫРАЖЕНИЕ обозначает любое выражение, действительное в SQL. Для дополнительной информации обратитесь к документу ORACLE7 Server SQL Language Reference Manual.
Для каждого ИМЕНИ_СТОЛБЦА в списке имен столбцов должно быть предоставлено ровно одно SQL_ВЫРАЖЕНИЕ в списке значений. Значения ассоциируются со столбцами в том порядке, в каком они указаны. Если список ИМЕН_СТОЛБЦОВ отсутствует, значения должны быть предоставлены для всех столбцов таблицы.
Типы данных вставляемых значений должны быть совместимы с типами соответствующих столбцов (или преобразуемы в них). Для дополнительной информации см. раздел "Типы данных" в главе 2.
select_предложение
Это - запрос, который извлекает данные из базы данных для вставки их в таблицу (или обзор). Синтаксис SELECT_ПРЕДЛОЖЕНИЯ совпадает с синтаксисом конструкта SELECT_INTO_ПРЕДЛОЖЕНИЕ, который определен в разделе "SELECT INTO" ниже в этой главе, с той разницей, что SELECT_ПРЕДЛОЖЕНИЕ не может иметь фразу INTO.
В этом варианте предложения INSERT в таблицу или представление будет вставлено столько строк, сколько возвращает SELECT_ПРЕДЛОЖЕНИЕ. SELECT_ПРЕДЛОЖЕНИЕ должно возвращать значение для каждого столбца из списка ИМЕН_СТОЛБЦОВ, или, если этот список отсутствует, для каждого столбца таблицы или представления. Как и для фразы VALUES, необходимо позиционное попарное соответствие между элементами в списке SELECT и столбцами в списке ИМЕН_СТОЛБЦОВ.
Замечания по использованию
Если используется ключевое слово VALUES со списком значений, то все календарные и символьные литералы должны быть заключены в апострофы ('). Числовые литералы не заключаются в апострофы.
Неявный курсор SQL и атрибуты курсора %NOTFOUND, %FOUND, %ROWCOUNT и %ISOPEN позволяют вам получать полезную информацию о выполнении предложения INSERT. Для подробностей обратитесь к разделу "Управление курсорами" в главе 4.
Предложение INSERT может вставить одну или несколько строк, но может и не вставить ни одной строки. Если вставлена хотя бы одна строка, происходит следующее:
Примеры
INSERT INTO bonus SELECT ename, job, sal, comm FROM emp
WHERE comm > sal * 0.25;
INSERT INTO emp (empno, ename, job, sal, comm, deptno)
VALUES (4160, 'STURDEVIN', 'SECURITY GUARD', 2045, NULL, 30);
DECLARE
my_deptno NUMBER;
my_dname NUMBER;
BEGIN
my_deptno := 70;
my_dname := 'Distribution';
INSERT INTO dept
VALUES (my_deptno UPPER(my_dname), 'CHICAGO');
END;
Описание
Курсоры PL/SQL имеют четыре атрибута, включая %ISOPEN. Эти атрибуты, присоединяемые к имени курсора, помогают обращаться к полезной информации курсора. Для дополнительной информации см. раздел "Управление курсорами" в главе 4.
PL/SQL использует два типа курсоров: явные и неявные. PL/SQL неявно объявляет курсор (с именем SQL) для любого предложения манипулирования данными SQL, включая однострочные запросы. ORACLE автоматически закрывает курсор SQL после выполнения ассоциированного с ним предложения SQL. Как результат, атрибут SQL%ISOPEN всегда дает FALSE.
В случае многострочных предложений SELECT вы можете явно объявить курсор для обработки возвращаемых строк. Атрибут %ISOPEN указывает, открыт ли соответствующий курсор. ИМЯ_КУРСОРА%ISOPEN дает TRUE, если курсор в данный момент открыт, и FALSE в противном случае.
Синтаксис
атрибут_%isopen ::= °°°°°°°°°°°°°°°°°°°°° имя_курсора%ISOPEN °°°°°°°°°°°°°°°°°°°°°°°°°°°
Ключевые слова и параметры
имя_курсора
Этот параметр должен быть именем явно объявленного курсора или именем неявного курсора (SQL). Соглашения об именах приведены в разделе "Идентификаторы" в главе 2.
Замечания по использованию
Атрибут %ISOPEN можно использовать в процедурных предложениях, но нельзя использовать в предложениях SQL. Атрибут %ISOPEN ассоциирован с каждым явным курсором. Это позволяет вам применять этот атрибут к любому явному курсору, чтобы проверить, открыть ли он. Если вы не уверены в состоянии курсора, используйте атрибут %ISOPEN. Не забывайте, что SQL%ISOPEN всегда дает FALSE.
Пример
...
IF NOT (my_cursor%ISOPEN) THEN
OPEN my_cursor;
END IF;
FETCH my_cursor INTO ...
...
Связанные темы
CLOSE, Курсоры, DELETE, FETCH, INSERT, OPEN, SELECT INTO, UPDATE
Синтаксис
числовой_литерал ::=
°°°°°°°°°°°°°°°° °°°°°°°° °°°° °° целое °°°°°°°°°°° °°°°°°°°°°°°°°°°
│°° + °°°▄ ≤°° действительное °°╠
≤°° - °°°╠
целое ::=
╡°°°°°°°°°°≈
°°°°°°°°°°°°°°°°°°°°°°°°°°°° цифра °≥°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
действительное ::=
°°°° °° целое °° °°°°°°°°°° ° °°°° °°°°°°°°°°°°°°°°°°°°°°°°°° °°°°°°
▀ ≤° .целое °╠ ▀ ≤°° ° E ° ° °°°°° ° целое °╠
│°° .целое °°°°°°°°°°°°°°▄ ≤° e °╠ │° + °▄
≤°° целое. °°°°°°°°°°°°°°╠ ≤° - °╠
символьный_литерал ::=
°°°°°°°°°°°°°°°°°°° ° 'символ' ° °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
≤° '''' °°°°°╠
строковый_литерал ::=
╡°°°°°°°°°°°°°°≈
°°°°°°°°°°°°°° ' °°° ° символ ° °°° ' °°°°°°°°°°°°°°°°°°°°°°°°°°°°°
≤° '' °°°°°╠
булевский_литерал ::=
°°°°°°°°°°°°°°°°°°°°°°°° °° TRUE °° °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
│°° FALSE °▄
≤°° NULL °°╠
Ключевые слова и параметры
целое
Целое число с необязательным знаком и без десятичной точки.
действительное
Целое или дробное число с необязательным знаком и с десятичной точкой.
цифра
Одна из цифр от 0 до 9.
символ
Элемент из набора символов PL/SQL. Для дополнительной информации см. раздел "Набор символов" в главе 2.
TRUE, FALSE
Предопределенные булевские значения.
NULL
Предопределенное "не-значение", обозначающее отсутствующее, неизвестное или неприменимое значение.
Замечания по использованию
В арифметических выражениях можно использовать два вида числовых литералов: целочисленные и действительные. Числовые литералы должны отделяться друг от друга пунктуацией. В дополнение к пунктуации, можно использовать пробелы.
Символьный литерал - это одиночный символ, заключенный в апострофы. Символьные литералы включают все печатаемые символы в наборе символов PL/SQL: буквы, цифры, пропуски и специальные символы. PL/SQL различает прописные и строчные буквы с символьных литералах. Например, литералы 'Q' и 'q' различны.
Строковый литерал - это последовательность из нуля или более символов, заключенной в апострофы. Пустая строка ('') содержит 0 символов. Если необходимо включить апостроф в литерал, его изображают в виде двойного апострофа (''). PL/SQL различает прописные и строчные буквы с строковых литералах. Например, литералы 'white' и 'White' различны.
Кроме того, в строковых литералах хвостовые пробелы являются значащими, так что литералы 'White' и 'White ' различны. То, как строковый литерал сравнивается с переменной, НЕ зависит от этой переменной - хвостовые пробелы в литерале никогда не отсекаются.
В отличие от "не-значения" NULL, булевские значение TRUE и FALSE нельзя вставлять в столбец базы данных.
Примеры
Примеры числовых литералов:
25 6.34 7E2 25e-03 .1, 1. +17 -4.4
Примеры символьных литералов:
'H' '&' ' ' '9' ']' 'g'
Примеры строковых литералов:
'$5,000'
'02-AUG-87'
'Don''t leave without saving your work.'
Связанные темы
Переменные и константы
Описание
LOCK TABLE позволяет вам заблокировать одну или несколько таблиц в указанном режиме, что позволяет вам регулировать одновременный доступ к таблицам, поддерживая ее целостность. Для дополнительной информации обратитесь к разделу "Использование LOCK TABLE" в главе 4.
Синтаксис
╡°°°°°°°°° , °°°°°°°°°°°≈
°°°°°° LOCK TABLE °°°°° ссылка_на_таблицу °°≥°°°°°° IN °°°°°°°°°°°°°
°°°°°°° режим_блокировки °°° MODE °°° °°°°°°°°°°°° °°° ; °°°°°°°°°°°°
≤°° NOWAIT °°╠
где ССЫЛКА_НА_ТАБЛИЦУ имеет следующий синтаксис:
°°°°°°°°°°°° °°°°°°°°°° °°°°° ° таблица ° °°°°° °°°°°°°°°°°° °°°°°°°
≤° схема. °╠ ≤° обзор °°°╠ ≤° @связьБД °╠
Ключевые слова и параметры
ссылка_на_таблицу
Этот идентификатор задает имя таблицы (или обзора), которую вы хотите заблокировать. Таблица должна существовать в базе данных, к которой вы присоединены во время выполнения предложения LOCK TABLE.
режим_блокировки
Этот параметр специфицирует режим, в котором вы хотите установить блокировку таблицы. Режим может быть одним из следующих: ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE, SHARE, SHARE ROW EXCLUSIVE или EXCLUSIVE.
NOWAIT
Этот параметр специфицирует, что, если запрос LOCK TABLE не может быть удовлетворен (возможно, потому, что таблица уже заблокирована другим пользователем), то LOCK TABLE вернет управление пользователю, вместо того, чтобы ждать удовлетворения запроса. Вы можете повторить попытку позже.
Замечания по использованию
Если вы опустите ключевое слово NOWAIT, то ORACLE будет ждать освобождения таблицы; это ожидание не имеет устанавливаемого предела. Блокировка таблицы освобождается, когда ваша транзакция выдает COMMIT или ROLLBACK. Для дополнительной информации обратитесь к документу ORACLE7 Server SQL Language Reference Manual.
Пример
В следующем примере таблица accts блокируется в режиме разделения:
LOCK TABLE accts IN SHARE MODE;
Связанные темы
COMMIT, DELETE, INSERT, ROLLBACK, SAVEPOINT, UPDATE
Описание
Предложение LOOP повторно выполняет ряд предложений ноль или более раз. Конструкт цикла окружает последовательность предложений, которые требуется повторять. PL/SQL поддерживает следующие четыре типа циклов:
Синтаксис
loop_предложение ::=
°°° °°°°°°°°°°°°°°° ° °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° ° LOOP °°
≤°<<имя_метки>>°╠ ≤° WHILE °°° plsql_условие °°°°°°°°°°°▄
FOR ° ° параметр_числового_цикла °°▄
≤° параметр_курсорного_цикла °╠
°°°° ряд_предложений °°° ENP LOOP °°° °°°°°°°°°°°°°°° °°° ; °°°°°°°°°
≤°° имя_метки °°╠
параметр_числового_цикла ::=
°°° индекс °°° IN °°° °°°°°°°°°°° ° целое_выр °°° .. °° целое_выр °°
≤° REVERSE °╠
параметр_курсорного_цикла ::=
°°° имя_записи °° IN °° ° имя_курсора °° °°°°°°°°°°°°°°°°°°°°°°°° °
▀ ▀ ╡°°°° , °°°°°≈ ▀▀
▀ ≤° ( °° параметр °≥° ) °╠▀
≤°°°° ( °°°° select_предложение °°°° ) °°°°╠
Ключевые слова и параметры
имя_метки
Этот необъявляемый идентификатор задает необязательное имя
цикла. Соглашения об именах описаны в разделе "Идентификаторы"
в главе 2. Если используется, ИМЯ_МЕТКИ должно быть заключено в
двойные угловые скобки и должно стоять непосредственно перед
предложением LOOP. Это же имя может (не обязательно) появиться
также в конце предложения LOOP.
Элементы языка 9-69
Вы можете использовать ИМЯ_МЕТКИ в предложении EXIT, чтобы выйти
из цикла, помеченного этим именем.
Из-за правил сферы PL/SQL, вы не можете обращаться к индексной
переменной внешнего цикла FOR из внутреннего (вложенного) цикла
FOR, если оба индекса имеют одно и то же имя, если не уточнять
имя индекса ИМЕНЕМ_МЕТКИ внешнего цикла, используя следующий
синтаксис:
имя_метки.индекс
В следующем примере вы проверяете значение индекса внешнего
цикла FOR из внутреннего цикла FOR (заметьте, что оба индекса
имеют одно и то же имя):
<