WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Pages:     | 1 || 3 | 4 |   ...   | 7 |

«ОФИЦИАЛЬНОЕ АВТОРИЗОВАННОЕ ИЗДАНИЕ ORACLE PRESS™ ЭКСКЛЮЗИВНЫЕ ПРАВА ПРИНАДЛЕЖАТ ИЗДАТЕЛЬСТВУ OSBORNE Программирование на языке PL/SQL Разработка эффективных приложений )мощью PL/SQL OFFICIAL • Oracle ...»

-- [ Страница 2 ] --

масштаб отрицателен, то сохраняемое значение округляется до числа цифр, указанного в масштабе, отсчет ведется влево от десятичной точки.

Максимальная точность — 38 цифр, а масштаб может иметь значение в диапазоне от -84 до 127.

Подтип (subtype) — это альтернативное имя для некоторого типа. С его помощью можно ограничить множество значений, допустимых для переменных данного подтипа (см. ниже). Типу NUMBER эквивалентен целый ряд подтипов, которые, в сущности, являются тем же самым, что и NUMBER, так как ни один из них не ограничен. Альтернативные имена можно использовать для повышения удобочитаемости программ либо для обеспечения совместимости с типами данных, применяемыми в дру гих базах данных. Типу NUMBER эквивалентны:

• DEC • DECIMAL • DOUBLE PRECISION • FLOAT Основы PL/SQL • NUMERIC • REAL Среди типов, которые могут содержать числа с плавающей запятой, DEC, DECIMAL и NUMERIC имеют максимальную точность 38 десяти чных знаков. DOUBLE PRECISION и FLOAT имеют точность 126 двоич ных знаков, что приблизительно соответствует 38 десятичным цифрам.

REAL имеет точность 63 двоичных знака, что приблизительно дает 18 де сятичных знаков.

В дополнение к приведенным выше подтипам без ограничений, под типы INTEGER, INT и могут хранить целые числа с максималь ной точностью 38 десятичных знаков.

BINARY_INTEGER Данные, имеющие тип NUMBER, хранятся в десяти чном формате, который специально создан для точного и эффективного хранения информации. Вследствие этого арифметические операции не льзя выполнять непосредственно над значениями типа NUMBER. Чтобы числовые величины могли быть обработаны, значения типа NUMBER должны быть преобразованы в двоичный тип. Если имеется арифметиче ское выражение, в котором используются значения типа NUMBER, то в PL/SQL это преобразование, а также (при необходимости) преобразова ние результата обратно к типу NUMBER выполняются автоматически.

Если же значение не будет храниться в базе данных, а будет применять ся лишь в вычислениях, можно воспользоваться типом данных BINARYJNTEGER. Этот тип служит для хранения знаковых целых значе ний, которые могут лежать в диапазоне от -2 147 483 647 до +2 147 483 647.

Данные хранятся в двоичном дополнительном формате, а это означает, что для их использования в вычислениях не требуется выполнять преоб разование. Тип BINARYJNTEGER обычно имеют счетчики циклов.

Как и для NUMBER, для типа BINARYJNTEGER определен ряд подти пов. Однако в отличие от NUMBER подтипы BINARYJNTEGER ограни чены, т.е. с их помощью можно хранить значения из ограниченного диапазона. Подтипы BINARYJNTEGER приведены в таблице 3.3.

Таблица 3.3. BINARYJNTEGER Подтип Ограничение NATURAL NATURALN 0...2 147 483 647 NOT NULL POSITIVE POSITIVEN 147 473 647 NOT NULL PLS_INTEGER Тип имеет тот же диапазон значений, что и BINARYJNTEGER -2 147 483 647 до +2 147 483 647, и реализован так же при помощи собственного двоичного дополнительного формата. Одна ко, если при выполнении некоторой операции переполняется значение типа PLSJNTEGER, возникает ошибка. В случае же переполнения 88 значения, имеющего тип результат может быть при своен переменной типа NUMBER (который имеет больший без всякой ошибки. Различие между этими двумя форматами иллюстри руется следующим сеансом (см. ниже раздел "Выражения и -- Этот пример содержится в файле SQL> 2 BINARY_INTEGER;

3 BEGIN 4 - Присвоим максимальное значение 5 := 2147483647;

Добавим 1 к (что приведет к а затем 8 -- вычтем ее. Результат этого вычисления 9 •- соответствует диапазону никакой ошибки 10 -- не возникает.

12 END;

13 / PL/SQL procedure successfully completed.

SQL DECLARE 2 v_PLSInt PLS_INTEGER;

3 BEGIN 4 - Присвоим максимальное значение 5 v_PLSInt := 2147483647;

7 •- Добавим 1 к v_PLSInt (что приведет к а затем 8 - вычтем ее. Хотя результат этого вычисления будет 9 - соответствовать диапазону промежуточное значение 10 — выходит за пределы диапазона, поэтому возникает ошибка ORA-1426.

11 v_PLSInt := v_PLSInt + 12 END;

13 / DECLARE ERROR at line numeric overflow at line Семейство символьных типов Переменные этих типов используются для хранения строковых или сим вольных данных. В это семейство входят типы VARCHAR2, CHAR и LONG, а также и (два последних типа доступны то лько в и VARCHAR2 Этот тип аналогичен типу применяемому в ба зах данных. При помощи переменных типа можно хранить строки символов переменной длины. Синтаксис объявления перемен ной, имеющей тип таков:

Основы PL/SQL где L — максимальная длина (length) переменной. Указание длины обяза тельно — значения по умолчанию не существует. Максимальная длина пе ременной типа составляет 32 767 байт. Обратите внимание, что в поле столбца базы данных, имеющем тип можно хра нить только 4000 байт. Если длина типа превышает 4000 байт, ее можно ввести лишь в столбец базы данных, име ющий тип LONG, максимальный размер которого составляет 2 Гбайт или GLOB (4 Гбайт). Аналогично, данные LONG и CLOB нельзя поместить в переменную если их размер превышает 32 767 байт.

Внимание В в поле столбца базы данных, имеющем тип VARCHAR2, можно сохранять 2000 байт. Таким образом, может быть записана в столбец VARCHAR2, только если ее длина не превышает 2000 байт.

Для типа VARCHAR2 длина указывается не в символах, а в байтах.

Информация хранится в базе данных с помощью принятого набора сим волов, например ASCII, EBCDIC Code Page 500 или набора многобайто вых символов переменной длины, такого как Unicode. Если в некотором наборе символов базы данных содержатся многобайтовые символы, максимальное число символов, которое может храниться в переменной типа VARCHAR2, скорее всего, будет меньше указанной длины. Дело в том, что для представления одного символа может использоваться бо лее одного байта.

Подтипы VARCHAR и STRING эквивалентны типу Совет Почему два типа: VARCHAR и Тип VARCHAR определен ANSI, а тип VARCHAR2 определен Oracle.

В настоящее время они ведут себя одинаково. Если тип ANSI VARCHAR изменится в будущем, то Oracle VARCHAR2 не изменится, В синтаксис объявления переменной расширен до где L также является максимальной длиной переменной. CHAR или BYTE используется для указания что L измеряется в символах или байтах соответственно (по умолчанию применяется CHAR). Максималь ная длина, однако, по-прежнему составляет 32 767 байт. что данных использует набор символов UTF8, который содержит мно гобайтовые символы переменной длины. Максимальная длина символа UTF8 равна 3 байтам. Это означает, что переменная, объявленная как BYTE), может содержать максимум 100 символов в зави симости от реальных хранимых символов.

90 ГЛАВА CHAR Переменные этого типа представляют собой строки символов фиксированной длины. Синтаксис объявления переменной CHAR таков:

где L — максимальная длина в байтах. Однако в отличие от типа в этом случае указание длины необязательно. Если она не задана, прини мается значение по умолчанию, равное причем круглые скобки не нуж ны. Переменные типа CHAR имеют фиксированную длину, поэтому при необходимости они заполняются до максимальной длины пробелами.

Следовательно, переменные типа CHAR не всегда будут совпадать при выполнении операций сравнения символов (см. главу Максимальная длина переменной типа CHAR равна 32 767 байт. Мак симальная же ширина поля столбца базы данных, имеющего тип CHAR, составляет 2000 байт. Таким образом, если в переменной CHAR содер жится более 2000 байт, ее можно ввести только в столбец базы данных типа (если длина <= 4000 байт) или LONG. Аналогично, дан ные типа LONG можно поместить в переменную типа CHAR только в слу чае, если их размер составляет не более 32 767 байт.

• Внимание В в поле столбца базы данных, имеющем тип CHAR, можно сохранять до 255 байт.

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

Подтипом CHAR, имеющим те же ограничения, является CHARACTER.

Семантика переменных и переменных CHAR существенно различается (см. главу В синтаксис объявления переменной CHAR расширен до где L также является максимальной длиной переменной. CHAR и BYTE используются для указания на то, что будет измеряться в символах или байтах соответственно (по умолчанию применяется Максималь ная длина, однако, по-прежнему составляет 32 767 байт. Предположим, что база данных использует набор символов UTF8, который содержит многобайтовые символы переменной длины. В UTF8 максимальная дли на символа равна 3 байтам. Это означает, что переменная, объявленная как BYTE), сможет содержать максимум 100 символов (в слу чае необходимости дополненных пробелами) в зависимости от реально используемых символов.

Основы PL/SQL LONG В отличие от типа LONG, используемого в базах данных и позво ляющего хранить до 2 Гбайт информации, при помощи типа LONG PL/SQL можно сохранять последовательности символов переменной длины, максимальный размер которых равен 32 760 байт. Переменные LONG очень похожи на переменные Если в поле столбца LONG базы данных содержится более 32 760 байт информации, помес тить эту информацию в LONG нельзя. Однако мак симальная длина LONG меньше, чем поле LONG базы данных, поэтому LONG может быть помещена в столбец LONG базы данных безо всяких ограничений.

NCHAR и NVARCHAR2 В предусмотрены два дополнительных типа. Это символьные типы (National Language Support — поддержка языков): и Они служат для хранения строк символов с применением набора символов, отличного от того, ко торый используется в языке программирования PL/SQL. Такой набор называется набором символов (national character set).

Переменные типов NCHAR и описываются и использу ются точно так же, как переменные типов CHAR и Однако длина может меняться в зависимости от применяемого национального набора символов. Если в таком наборе размер символов фиксирован, дли на указывается в символах. Если же их размер может меняться, длина ука зывается в байтах.

Внимание Б длина NCHAR и NVARCHAR2 всегда определяется в символах.

Более подробно о типах NCHAR, и о NLS рассказывает ся в справочном руководстве "Server SQL Reference".

Семейство типов Типы этого семейства служат для хранения двоичных данных. При необ ходимости Oracle автоматически преобразует символьные переменные, для которых применяются разные наборы символов. Это может происхо дить, когда информация передается из одной базы данных в другую по средством соединения баз данных, каждая из которых использует свой набор символов. Для переменных, имеющих необработанный тип (raw это не выполняется.

RAW Переменные типа RAW похожи на переменные типа CHAR, одна ко они не преобразуются из одного набора символов в другой. Синтаксис описания переменной RAW таков:

где L — длина переменной в байтах. Тип RAW используется для хранения двоичных данных фиксированной длины. В отличие от символьных дан ных, данные типа RAW не преобразуются из одного набора символов в другой при их передаче из одной базы данных в другую. Максимальная 92 длина переменной RAW равна 32 767 байт. Максимальная же длина поля RAW базы данных составляет 2000 байт (255 в поэтому, если размер данных превышает 2000 байт, они не могут быть введены в стол бец RAW базы данных. Однако они могут быть введены в столбец базы данных, имеющий тип LONG RAW, максимальная длина которого состав ляет 2 Гбайт. Аналогично, если длина данных в поле LONG RAW превы шает 32 767 байт, нельзя поместить их в RAW.

LONG RAW Данные типа LONG RAW похожи на данные типа LONG за исключением того, что в PL/SQL не происходит их преобразование из одного набора символов в другой. Максимальная длина переменной LONG RAW равна 32 760 байт. Максимальная длина поля LONG RAW базы данных составляет 2 Гбайт, поэтому, если фактический размер дан ных превышает 32 760 байт, поместить их в LONG RAW нельзя. Но максимальная длина LONG RAW вполне подходит для ее ввода в поле LONG RAW базы данных, поэтому ограничений на ввод LONG RAW в поля LONG RAW базы данных не существует.

Семейство временных типов (дата/интервал) Существуют три вида временных типов данных: DATE, TIMESTAMP и INTERVAL. TIMESTAMP и INTERVAL доступны в и выше.

DATE Тип PL/SQL DATE абсолютно аналогичен типу DATE, применяе мому в базах данных. Тип DATE используется для хранения информации о датах и о времени, в том числе о веке, годе, месяце, дне, часах, минутах и секундах. Данные о долях секунд не Внутренний размер пере менной DATE составляет 7 байт, по одному байту на каждый компонент (от века до секунды).

Переменной DATE можно присвоить значение символьной перемен ной либо другой переменной DATE. Символьные переменные неявно преобразуются в даты с помощью используемого по умолчанию формата даты для текущего сеанса. Для дополнительного управления лучше при менять встроенную функцию TO_DATE для присваивания значений и функцию для их извлечения. Встроенные функции преобразо вания описываются ниже в разделе "Преобразования типов данных" и в главе 5.

TIMESTAMP Тип TIMESTAMP аналогичен типу DATE в том смысле, что содержит год, месяц, день, час, минуту и секунду некоторого момента времени. Однако отметки времени могут хранить доли секунды. Синтак сис определения переменной TIMESTAMP следующий:

где Р является точностью дробной части поля секунд, по умолчанию ис пользуется 6.

Тип TIMESTAMP WITH TIME ZONE содержит также определенный часовой пояс в дополнение к данным отметки времени. Он определяется с помощью следующего выражения:

Основы PL/SQL WITH TIME ZONE где Р— точность дробной части поля секунд.

Тип WITH LOCAL TIME ZONE всегда хранит часовой пояс базы данных, независимо от часового пояса пользователя. Он деляется следующим образом:

WITH LOCAL TIME ZONE где Р— точность дробной части поля секунд.

INTERVAL Тип INTERVAL служит для хранения интервала времени между двумя отметками времени. Тип INTERVAL YEAR TO MONTH хра нит число лет и месяцев и определяется с помощью TO MONTH где Р — число цифр в поле года, которое по умолчанию равно 2. Тип INTERVAL DAY TO SECOND содержит число дней и секунд и определя ется с помощью где число цифр в поле дня (по умолчанию 2), a число цифр в дробной части поля секунд (по умолчанию — Семейство типов ROWID В этом семействе представлены два типа: и доступен в выше.

ROWID Тип PL/SQL ROWID абсолютно аналогичен типу, используемому для работы с псевдостолбцами ROWID базы данных. Он дает возможность сохранять идентификаторы строк которые можно рассматривать в качестве ключей, однозначно определяющих каждую строку базы дан ных. Идентификаторы строк хранятся внутри базы данных в виде двоич ных значений фиксированной длины, размер которых зависит от используемой операционной системы. Для работы с идентификаторами их можно преобразовать в последовательности символов при помо щи встроенной функции Результатом работы этой функ ции является последовательность, имеющая в формат:

Г) BBBBBBBB.RRRR.FFFF где определяет блок в файле базы данных, RRRR — строку в блоке, a FFFF — номер файла. Каждый элемент идентификатора строки представлен в виде числа. Например, идентификатор указывает на 30-й блок, 255-ую строку в этом блоке, который расположен в файле 1. В базах данных и выше идентификатор строки rowid использует расширенный формат, который также является строкой, представляющей значение в записи base-64. Компоненты 94 ГЛАВА расширенного формата rowid можно определить с помощью модуля описанного в приложении А.

Идентификаторы строк обычно не создаются программами PL/SQL;

они выбираются из псевдостолбца ROWID таблицы. Выбранное значе ние может быть использовано в предложении WHERE последующего опе ратора UPDATE или DELETE.

UROWID Хотя каждая строка в таблице, доступной в базе данных Orac le, имеет адрес, это может быть не физический адрес. Например, строки в таблицах имеют логический rowid, который основывается на первичном ключе таблицы. Таблицы в базах данных, отличных от Oracle, но доступных через шлюз, также имеют логические rowid. Тип данных UROWID может содержать как физический rowid (т.е. типа ROWID), так и логический rowid. Oracle рекомендует исполь зовать UROWID в новых приложениях, так как он является более гибким.

Дополнительную информацию о логических rowid и индексно-органи зованных таблицах можно найти в "Oracle Concepts".

Семейство логических типов Единственным типом данных этого семейства является тип BOOLEAN.

Логические переменные используются в управляющих структурах PL/SQL, таких как операторы и LOOP. Возможные значе ния типа BOOLEAN: TRUE, FALSE и NULL. Приведенный ниже раздел объявлений неверен, так как 0 не является допустимым значением для типа BOOLEAN:

DECLARE v_ContinueFlag BOOLEAN := 0;

Семейство типов Trusted Единственным типом данных этого семейства является тип MLSLABEL, используемый в Trusted Oracle для хранения двоичных меток перемен ной длины. В стандартной системе Oracle в переменных и столбцах, име ющих тип MLSLABEL, могут содержаться только NULL-значения.

Внутренняя длина переменных типа MLSLABEL составляет от 2 до байт, однако их можно автоматически преобразовывать в символьные пе ременные, а также выполнять обратное преобразование. Максимальная длина символьного представления переменной MLSLABEL составляет 255 байт.

Внимание MLSLABEL недоступен в Orac/eSi.

Составные типы В PL/SQL доступны следующие составные типы: записи, таблицы (вло женные и индексные) и изменяемые массивы. Составной тип содержит компоненты. В переменной, имеющей составной тип, находится одна или несколько скалярных переменных (называемых также Основы PL/SQL Записи подробно рассматриваются ниже в разделе "Записи PL/SQL", a таблицы и изменяемые массивы — в главе 8.

Ссылочные типы После того как объявлена переменная PL/SQL скалярного или составно го типа, для ее хранения выделяется определенная область памяти. Пере менная дает выделенной области имя и впоследствии используется в программе для ссылки на нее. Однако нельзя отменить выделение памяти и одновременно сохранить возможность работы с переменной — память не освобождается до тех пор, пока переменная находится в области свое го действия (см. ниже). Для ссылочных типов такого ограничения нет.

Ссылочный тип PL/SQL — это то же самое, что и указатель в С. Перемен ная, объявленная как ссылочная, во время выполнения программы может указывать на различные области памяти.

В 7 был доступен только один ссылочный тип — REF CURSOR, на зываемый также курсорной переменной (см. главу 4). В существует объектный тип который может указывать на некоторый объект.

Типы LOB Типы LOB используются для хранения больших объектов.

ект (large object) может быть двоичным, либо символьным значе нием размером до 4 Гбайт. В больших объектах могут содержаться неструктурированные данные, доступ к которым осуществляется эффек тивнее, чем к данным типа LONG и LONG RAW, с меньшим числом ограничений. Типы LOB управляются с помощью модуля (см. главу 12).

Объектные типы Объектный тип является составным типом, который имеет внутри себя атрибуты (переменные других типов) и методы (подпрограммы). Orac позволяет создавать объектные типы для представления объектов реального мира. расширяет объектную модель, включая в нее наследование и создание подтипов (см. главу 12).

Использование %TYPE Во многих случаях для работы с данными, хранимыми в таблицах базы данных, используются переменные PL/SQL. При этом переменной, рабо тающей с некоторым столбцом, следует присваивать тип, соответствую щий типу столбца. Например, столбец таблицы students имеет тип С учетом этого можно объявить переменную следую щим образом:

Г) DECLARE VARCHAR2(20);

96 ГЛАВА Посмотрим, что произойдет, если описание столбца изме нится. Предположим, что таблица модифицирована и столбец имеет теперь тип Текст программы PL/SQL, в которой используется этот столбец, должен быть изменен:

DECLARE VARCHAR2(25);

Если программа PL/SQL велика, этот процесс может занять много времени, и, кроме того, существует большая вероятность внесения ошиб ки. В этом случае вместо жесткого задания типа переменной можно вос пользоваться атрибутом Он добавляется к ссылке на столбец таблицы или к другой переменной и возвращает ее тип. Например:

DECLARE v_FirstName При использовании переменная будет иметь тот тип, который присвоен столбцу таблицы students. Тип опреде ляется всякий раз, когда данный блок выполняется для анонимных и име нованных блоков и когда компилируются хранимые объекты (процедуры, функции и т.д.). может быть также использован с переменными PL/SQL, объявленными ранее. Приведенный ниже пример иллюстрирует различные варианты применения атрибута Г] DECLARE -- NUMBER (5) - NUMBER (5) NOT NULL := 12.3;

v_AnotherVar - NUMBER (7,3) Если атрибут применяется для переменной (столбца), которая (который) содержит ограничение NOT NULL (например, classes.

и то возвращаемый тип не имеет этого ограничения. Приведен ный выше блок вполне корректен, хотя переменные v_RoomID2 и v_AnotherVar не инициализированы. Дело в том, что эти переменные могут содержать Использование атрибута считается хорошим стилем програм мирования, так как при этом программы PL/SQL становятся гибче и про ще адаптируются к изменению различных параметров, задаваемых в базе данных.

Подтипы, определяемые пользователями Подтип (subtype) — это тип PL/SQL, в основе которого лежит существую щий тип. С помощью подтипа можно дать типу альтернативное имя, ко торое более точно описывает его назначение. Ряд подтипов PL/SQL (например, DECIMAL и INTEGER - подтипы NUMBER) определен в мо дуле STANDARD. Для определения подтипа используется следующий синтаксис:

SUBTYPE IS Основы PL/SQL где — имя нового подтипа, а указывает базовый тип. Базовый тип может быть либо предопределенным типом, либо под типом, либо ссылкой Например:

DECLARE SUBTYPE t_LoopCounter IS NUMBER;

- определяем новый подтип t_LoopCounter;

•- объявляем переменную этого подтипа SUBTYPE IS students.

Подтип нельзя ограничивать непосредственно в определении SUBTYPE.

Приведенный ниже блок неверен:

DECLARE SUBTYPE T_LoopCounter IS NUMBER (4);

-- неверное ограничение Однако этот запрет можно обойти: следует объявить фиктивную пере менную нужного типа (с ограничением) и в определении SUBTYPE восполь зоваться атрибутом DECLARE NUMBER (4);

•- фиктивная переменная, которая не -- будет использоваться SUBTYPE is - возвращает v_Counter Это ограничение было снято в Поэтому следующий раздел объ явлений является допустимым:

Г] DECLARE SUBTYPE IS допустимо в При объявлении переменной с неограниченным подтипом ее тип мо жет быть ограничен:

Q DECLARE SUBTYPE IS NUMBER;

-- определяем неограниченный подтип, v_Counter is (5);

•- но ограниченную переменную Подтип принадлежит к тому же семейству типов, что и базовый тип.

Преобразование типов данных PL/SQL может выполнять преобразования между различными семейст вами скалярных типов данных. В пределах одного семейства типы дан ных можно преобразовывать произвольно, но с учетом ограничений, налагаемых на переменные. Так, переменную типа нельзя пре образовать в переменную типа так как не будет хватать места для хранения ее значения. Ограничения точности и масштаба так же могут препятствовать преобразованию, например, переменной в переменную NUMBER(3) и наоборот. В случае наруше ния ограничения компилятор PL/SQL не выдаст сообщения об ошибке, однако ошибки могут появиться во время выполнения программы — все зависит от значений преобразуемых переменных.

ГЛАВА Существуют два способа преобразования типов данных: явный и неявный.

Явное преобразование типов данных Встроенные функции преобразования, доступные в SQL, доступны и в PL/SQL. Краткое описание этих функций приведено в таблице 3.4. При необходимости их можно применять для явного преобразования типов данных, относящихся к различным семействам типов. Более подробную информацию о функциях преобразования и примеры их использования можно найти в главе 5.

Таблица 3.4. Функции преобразования типов данных PL/SQL и SQL Функция Описание Семейства типов, доступные для преобразования TO_CHAR Преобразует аргумент к типу VARCHAR2 Числовые типы, типы даты в зависимости от указанного формата (указание формата необязательно) TO_DATE Преобразует аргумент к типу DATE Символьные типы в зависимости от указанного формата (указание формата необязательно) Преобразует аргумент к типу Символьные типы в зависимости от указанного формата (указание формата необязательно) Преобразует аргумент к типу TIMESTAMP Символьные типы WITH в зависимости от указанного формата (указание формата необязательно) TO_DSINTERVAL* Преобразует аргумент к типу INTERVAL DAY Символьные типы ТО SECOND в зависимости от указанного формата (указание формата необязательно) TO_YMINTERVAL* Преобразует аргумент к типу INTERVAL YEAR Символьные типы ТО MONTH в зависимости от указанного формата (указание формата необязательно) TO_NUMBER Преобразует аргумент к типу NUMBER Символьные типы в зависимости от указанного формата (указание формата необязательно) Преобразует значение типа RAW Типы RAW в представление двоичной величины Преобразует шестнадцатеричное Символьные типы (значения представление в эквивалентную двоичную должны быть представлены величину в форме) CHARTOROWID Преобразует символьное представление Символьные типы (значения значения ROWID во внутренний двоичный должны быть представлены формат в формате идентификаторов строк) ROWIDTOCHAR Преобразует внутреннюю двоичную Тип ROWID переменную ROWID в внешний формат Эти функции доступны в и выше.

Основы PL/SQL Неявное преобразование типов данных В PL/SQL осуществляется автоматическое преобразование типов данных разных семейств, когда это возможно. Например, при помощи блока, приведенного ниже, извлекается текущее число зачетов у студента 10002:

DECLARE BEGIN SELECT INTO FROM students WHERE id = 10002;

END;

В этой базе данных поле current_credits имеет тип NUMBER(3), одна ко — это переменная типа PL/SQL авто матически преобразует числовые данные в строку символов, а затем присваивает ее символьной переменной. PL/SQL может автоматически выполнять преобразование между:

• Символьными типами и числовыми типами • Символьными типами и типами даты Хотя в PL/SQL производится неявное преобразование типов данных, при программировании рекомендуется использовать явные функции пре образования. В следующем примере это делается при помощи функции DECLARE VARCHAR2(5);

BEGIN SELECT TO_CHAR INTO FROM students WHERE id = 10002;

END;

Преимущество такого способа заключается в том, что при желании строку символов явного формата можно использовать также в функции Это облегчает понимание программы и подчеркивает преоб разование типов.

Автоматическое преобразование типов может осуществляться также при обработке в PL/SQL различных выражений (см. ниже раздел "Выра жения и Для выражений применима та же рекомендация: же лательно использовать явные функции преобразования типов.

Области действия и области видимости переменных Область действия (scope) переменной — это фрагмент программы, в кото ром возможно обращение к данной переменной. Для переменной PL/SQL это фрагмент с момента ее объявления до конца блока. Когда 100 переменная выходит из своей области действия, PL/SQL освобождает память, используемую для хранения переменной, и ссылки на нее стано вятся невозможны. На рис. 3.2 показано, что областью действия перемен ной является только внутренний блок;

после ключевого слова END внутреннего блока она становится недоступной. Область действия пе ременной до ключевого слова END внешнего блока. Внутренний блок является областью действия обеих переменных.

v Number BEGIN DECLARE v 10);

Область действия •Область действия BEGIN END;

Рис. 3.2. Область действия переменных Область видимости (visibility) переменной — это фрагмент программы, в котором возможно обращение к этой переменной без использования ее ква лифицированного имени. Область видимости всегда лежит в обла сти действия;

если переменная находится вне области своего действия, она невидима. Рассмотрим рис. 3.3. В точке 1 переменные v_AvailableFlag и v_SSN находятся в границах своих областей действия и видимы. В точке обе эти переменные находятся в пределах своих областей действия, но ви дима только переменная При объявлении переменной DECLARE v AvailableFlag BOOLEAN;

NUMBER(9);

Видимы v_AvailableFlag BEGIN и DECLARE v_SSN v_StartDate DATE;

BEGIN Видимы v_AvailableFlag, v_StartDate и v_SSN END;

Видимы v_AvailableFlag и Рис. 3.3. Область действия и область видимости Основы PL/SQL v_SSN типа CHAR(ll) объявление NUMBER(9) становится скрытым. В этой точке все четыре переменные находятся в границах своих областей действия, но видимы только три: v_AvailableFlag, v_StartDate и v_SSN В точке 3 переменные v_StartOate и v_SSN находятся вне пределов своих областей действия и поэтому больше не видимы. Здесь действуют и видимы те же переменные, что и в точке 1: v_AvailableFlag и v_SSN NUMBER(9).

Как обратиться в программе к переменной, которая находится в своей области действия, но невидима? Рассмотрим рис. 3.4. Это тот же самый блок, который был приведен на рис. 3.3, но для внешнего блока создана метка (см. ниже раздел "Управляющие структуры PL/SQL"). В точке 2 переменная v_SSN NUMBER(9) невидима. Однако обратиться к ней можно с помощью метки следующим образом:

«1 Outer» DECLARE v AvailableFlag BOOLEAN;

v SSN Видимы v AvailableFlag BEGIN и v SSN NUMBER(9) DECLARE v SSN v StartDate DATE;

Видимы v_AvailableFlag, :Date BEGIN и но при помощи 1 SSN можно обратиться к END;

END;

Видимы v AvailableFlag и v_SSN Рис. 3.4. Использование метки для ссылки на переменную Выражения и операции Посредством выражений и операций осуществляется связывание пере менных PL/SQL. С помощью операций определяются способы присваи вания переменным конкретных значений и способы работы с этими значениями. Выражение (expression) — это некоторая последовательность переменных и литералов, разделенных знаками операций, или ми (operator). Значение выражения определяется значениями перемен ных и литералов, составляющих это выражение, а также описанием используемых операций.

102 ГЛАВА Присваивание Основной операцией является операция присваивания (assignment). Ее синтаксис таков:

переменная где переменная — это переменная PL/SQL, а выражение — это выражение PL/SQL. Данная операция может производиться в выполняемом разделе и в разделе исключительных ситуаций блока. Ниже приводится ряд при меров использования операции присваивания:

DECLARE NUMBER;

BEGIN := v_Strlng2 := := END;

Величина, находящаяся в левой части операции присваивания, назы вается именующим значением (lvalue), а величина, находящаяся в правой части, — значением выражения (rvalue). Именующее значение должно ссы латься на некоторую реальную область памяти, так как в нее будет запи сываться значение выражения. В примере, приведенном выше, все именующие значения являются переменными. PL/SQL выделяет для хра нения переменных некоторую область памяти, и значения и могут быть размещены в этой области. Значение выражения может пред ставлять собой содержимое области памяти, на которую ссылается пере менная, или литералом. В нашем примере проиллюстрированы оба случая: — это литерал, a — переменная. Значение выра жения будет считываться, а именующее значение — записываться. Кроме того, все именующие значения являются и значениями выражений.

В отличие от других языков программирования, например С, в любом операторе (statement) PL/SQL может быть только одна операция присваи вания. Таким образом, следующая операция присваивания неверна:

Q DECLARE NUMBER;

NUMBER;

v_Va13 NUMBER;

BEGIN v_Va11 := v_Va12 := v_Va13 0;

END;

Выражения Выражения PL/SQL используются в качестве значений выражения поэтому использование выражения как самостоятельного оператора Основы PL/SQL бессмысленно — оно должно быть элементом оператора. Например, вы ражение может находиться в правой части операции присваивания или быть элементом SQL-оператора. Тип выражения определяют составляю щие его операции и типы операндов.

Операнд — это аргумент операции. В операциях PL/SQL используется либо один аргумент (унарная, или одноместная, операция), либо два аргу мента (бинарная, или двухместная, операция). Например, операция от рицания (-) является унарной, а операция умножения (*) — бинарной.

Приоритет операций выражения определяет порядок их выполнения.

Рассмотрим числовое выражение:

3 + ] Приоритет операции умножения выше приоритета операции сложе ния, поэтому результатом этого выражения будет 38 (3+35), а не 56 (8*7).

Чтобы изменить порядок вычисления выражения, заданный по умолча нию, следует использовать круглые скобки. Например, результатом при веденного ниже выражения будет 56:

(3 + 5) * Таблица 3.5. Операторы PL/SQL Операторы Тип Описание NOT Бинарные Операция возведения в степень, логическое отрицание Унарные Тождественность, отрицание Бинарные Умножение, деление *,/ Бинарные Сложение, вычитание, конкатенация строк =, !=, <, >, <=, >=, IS NULL, Бинарные (за исключением Логическое сравнение LIKE, BETWEEN, IN IS NULL, который является унарным) AND Бинарный Логическое соединение Бинарный OR Логическое включение Символьные выражения Существует лишь одна символьная операция — операция конкатенации, или сцепления (| |). С ее помощью соединяются две или большее количество символьных строк (или аргументов, которые могут быть неявно преобра зованы в символьные строки). Например, результатом выражения || будет World Если все операнды в выражении конкатенации имеют тип CHAR, то и оно само будет иметь тип CHAR. Если же хотя бы один операнд имеет тип выражение будет иметь тип Считается, что строковые литералы имеют тип CHAR, поэтому результатом предыдуще го примера является значение типа CHAR. Однако в следующем блоке пе ременной присваивается выражение, результат которого значение типа Г] DECLARE VARCHAR2(10) := v_Result VARCHAR2(20);

BEGIN := END;

Логические выражения Во всех управляющих структурах PL/SQL (за исключением GOTO) испо льзуются логические выражения, называемые также условиями. Логическое, или булево, выражение — это любое выражение, которое дает в результате логическое значение (TRUE (истина), (ложь) или NULL). Ниже приведен ряд логических выражений:

X > Y NULL (4 > 5) OR (-1 != Z) В трех операциях — AND OR (или) и NOT (не) — логические зна чения используются в качестве аргументов и возвращаются в качестве ре зультата. Возможные комбинации описываются в таблицах истинности (см. рис. 3.5). С помощью этих операций реализуется стандартная трех значная логика. AND возвращает TRUE только в том случае, если истин ны оба операнда, OR возвращает FALSE только тогда, когда оба операнда ложны.

NOT TRUE FALSE NULL FALSE TRUE NULL AND TRUE FALSE NULL TRUE TRUE FALSE NULL FALSE FALSE FALSE FALSE NULL NULL FALSE NULL OR TRUE FALSE NULL TRUE TRUE TRUE TRUE FALSE TRUE FALSE NULL NULL NULL NULL TRUE Рис. З.5. Таблицы истинности Основы PL/SQL NULL-значения усложняют логические выражения что NULL — это пропущенное или неизвестное значение). Результатом выражения TRUE AND NULL является NULL, так как неизвестно, истинен ли второй операнд. Более подробно об этом рассказывается ниже в разделе В операциях сравнения, или отношения, в качестве операндов исполь зуются числа, символы или данные, а возвращаются логические значения.

Ниже приведена таблица, описывающая эти операции.

Операция Описание Равно (равенство) Не равно (неравенство) < Меньше > Больше Меньше или равно >= Больше или равно Оператор IS NULL возвращает значение TRUE только тогда, когда операндом является NULL. NULL-значения не могут быть проверены на истинность при помощи операций отношения, так как любое выражение отношения, операндом которого является NULL, возвращает NULL.

Оператор LIKE (подобие) применяется для сопоставления строк сим волов с некоторым образцом, подобно тому, как это делается в регуляр ных выражениях системы Unix. Знак подчеркивания (_) соответствует одному символу, а знак процента (%) — нулю и более символам. Приве денные ниже выражения возвращают TRUE:

LIKE LIKE LIKE Оператор BETWEEN (между) объединяет операции <= и >= в одном выражении. Например, приведенное ниже выражение возвращает значе ние FALSE:

100 BETWEEN 110 AND А это выражение возвращает TRUE:

Г) 100 BETWEEN 90 AND Оператор IN (в) возвращает TRUE, если первый операнд содержится в наборе, определяемом вторым операндом. Например, результат этого выражения — FALSE:

106 Если в наборе содержатся NULL-значения, они так как при сравнении некоторого значения с NULL всегда будет возвращаться NULL.

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

Этими структурами являются условные операторы и циклы. Именно эти структуры совместно с переменными обеспечивают мощь и гибкость PL/SQL.

IF-THEN-ELSE Синтаксис оператора IF-THEN-ELSE IF THEN [ELSIF THEN ] [ELSE ] END IF;

где — любое выражение, результатом которого явля ется логическое значение (см. выше). Условия ELSIF и ELSE необязатель ны, причем условий ELSIF может быть сколь угодно много. Например, ниже представлен блок, демонстрирующий использование оператора IF THEN-ELSE с одним условием ELSIF и с одним условием ELSE:

— Этот пример содержится в файле if DECLARE BEGIN /* Извлекаем число мест в аудитории, идентификатор которой 20008.

Сохраняем результат в */ SELECT INTO FROM rooms WHERE = 20008;

IF < 50 THEN := ELSIF < 100 THEN := little ELSE := of END IF;

END;

Основы PL/SQL Этот блок функционирует в точности так, как это указано с помощью ключевых слов. Если первое условие истинно, выполняется первая после довательность операторов. В нашем случае первым условием является < А первая последовательность операторов := Если число мест не менее оценивается второе условие:

Г) < Если оно истинно, выполняется вторая последовательность операторов:

Г) := little Наконец, если число мест не менее 100, выполняется завершающая последовательность операторов:

:= of Каждая последовательность операторов выполняется только в случае истинности соответствующего условия.

В этом примере в каждой последовательности операторов имеется толь ко один процедурный оператор. Однако такие последовательности могут держать сколь угодно операторов (процедурных либо SQL-операторов).

Например:

— Этот пример содержится в файле DECLARE BEGIN /* Извлекаем число мест аудитории, идентификатор которой 20008.

Сохраняем результат в */ SELECT number_seats INTO FROM rooms WHERE = 20008;

IF < 50 THEN := INSERT INTO temp_table (char_.col) VALUES and < 100 THEN := little INSERT INTO (char_col) VALUES breathing ELSE := of END IF;

END;

108 ГЛАВА Внимание Обратите внимание на правописание — в этом слове отсутствует Е и нет пробела. Такой синтаксис заимствован из языка программирования Ada.

Условия NULL Последовательность операторов в операторе выполняется только в случае истинности соответствующего условия. Если результатом условия является FALSE или NULL, последовательность операторов не выполняется. В качестве примера рассмотрим два блока:

/* Блок 1 */ DECLARE NUMBER;

NUMBER;

VARCHAR2(7);

BEGIN IF < THEN := ELSE END IF;

END;

/* Блок 2 */ DECLARE NUMBER;

NUMBER;

VARCHAR2(7);

BEGIN IF >= THEN v_Result ELSE END IF;

END;

Одинаково ли будут вести себя эти два блока? Предположим, что = 3, a = 7. В результате условие блока 1 (3 < 7) будет ис тинным, и переменная v_Result будет установлена в Условие блока будет ложным (3 7), переменная v_Result также будет установлена в Для любых значений и не являющихся NULL, приведенные блоки функционируют одинаково.

Теперь предположим, что = 3, a v_Number2 содержит NULL.

Что произойдет в этом случае? Условие блока 1 (3 < NULL) дает в резуль тате NULL, поэтому будет выполнено условие ELSE и переменной v_Re будет присвоено значение Условие блока 2 (3 >= NULL ) также дает в результате NULL, поэтому будет выполнено условие ELSE и Основы PL/SQL переменной будет присвоено значение Если одна из пере менных или содержит NULL, то блоки функциони руют по-разному.

Можно сделать так, чтобы блоки функционировали одинаково. Для этого следует ввести проверку на наличие NULL:

/* Блок 1 */ DECLARE NUMBER;

NUMBER;

VARCHAR2(7);

BEGIN IF IS NULL OR IS NULL THEN := < THEN ELSE END IF;

END;

/* Блок 2 */ DECLARE NUMBER;

NUMBER;

VARCHAR2(7);

BEGIN IF IS NULL OR IS NULL THEN := ELSIF >= THEN ELSE := END IF;

END;

Условие IS NULL истинно только тогда, когда проверяемая переменная содержит NULL-значение. В противном случае условие ложно. После до бавления в блоки проверки на наличие NULL переменная v_Result будет принимать значение (неизвестно), если одна из переменных содержит NULL- значение. Сравнение переменных v_Number1 и будет выполняться только в том случае, если точно известно, что обе переменные не содержат NULL- значений;

при этом блоки будут функционировать одинаково.

ГЛАВА Во многих случаях блок IF-THEN-ELSE используется для выполнения различных операторов в зависимости от значения входной переменной.

Например, рассмотрим блок, который выбирает курс для студента на основе его специализации:

Г) — Этот пример содержится в файле DECLARE v_Major v_CourseName BEGIN - Извлекаем специализацию данного студента SELECT major INTO FROM students WHERE ID = 10011;

- На основе специализации выбираем курс IF = THEN = 'CS = THEN = THEN v_CourseName = ELSIF THEN v_CourseName = 'MUS ELSIF = THEN = ELSE v_CourseName = END IF;

END;

Этот код последовательно сравнивает значение переменной в различных операторах ELSIF. г предоставляет упрощенную конст рукцию, которая выполняет то же самое. Это оператор CASE. Аналогич но оператору переключателя в С, CASE имеет структуру:

CASE WHEN THEN WHEN THEN WHEN THEN [ELSE END CASE;

где проверяемая переменная или выражение, — сравниваемые значения, а...

— соответствующий код для выполнения. Если Основы PL/SQL test_var равна, например, будет выполняться Если ни одно из значений не совпадает, выполняется код Можно переписать наш пример с помощью CASE:

- Этот пример содержится в файле DECLARE v_Major BEGIN - Извлекаем профилирующую дисциплину данного студента SELECT major INTO FROM students WHERE ID = 10011;

- На основе специализации выбираем курс CASE WHEN THEN = 'CS WHEN THEN = WHEN THEN = WHEN THEN = WHEN THEN = ELSE = END CASE;

END;

Внимание Элемент используемый операторе CASE, может быть не только переменной, как в примере выше. Это может быть выражение произвольной сложности, содержащее вызовы функций. В любом случае оценивается только один раз, в начале выполнения оператора CASE. Более того, типы п должны быть типом test_var.

После выполнения заданной последовательности операторов управле ние немедленно передается оператору, следующему за CASE. He требуется использовать оператор break, как в случае переключателя С.

Операторы без предложения ELSE Предложение ELSE оператора CASE является необязательным. В случае если оно не указано, а проверяемое выражение не соответствует ни 112 A одному из сравниваемых значений, PL/SQL порождает предопределен ную ошибку которая эквивалента ORA-6592, как по казывает следующий пример сеанса г] -- Этот пример содержится в файле SQL> DECLARE 2 NUMBER := 1;

3 BEGIN •1 - Так как ни одно из предложений WHEN не проверяет значение 5 - будет возникать ошибка ORA-6592.

6 CASE 7 WHEN 2 THEN 8 WHEN 3 THEN 9 WHEN 4 THEN DBMS_OUTPUT. Four! ');

10 END CASE;

11 END;

12 / DECLARE * ERROR at line ORA-06592;

CASE not found while executing CASE statement at line Это эквивалентно предложению ELSE:

ELSE RAISE Дополнительная информация об исключениях и о том, как они обра батываются, представлена в главе 7.

Операторы CASE с меткой Как и блок PL/SQL, оператор CASE может иметь метку. Аналогичным об разом можно помечать и циклы (см. ниже). Если оператор CASE поме чен, то метка может указываться также после предложения END CASE, например:

— Этот пример содержится в файле DECLARE v_TestVar NUMBER := BEGIN - Этот оператор CASE является помеченным CASE WHEN 1 THEN WHEN 2 THEN WHEN 3 THEN WHEN 4 THEN END CASE MyCase;

END;

Метка после END CASE является законной только в случае, если сам оператор CASE является помеченным, и обе метки должны совпадать.

Основы PL/SQL Операторы CASE с поиском В рассмотренных выше примерах использовались операторы с веркой — каждое предложение WHEN сравнивало значение с единственным тестовым выражением. Применяются также операторы CASE с поиском, они имеют следующую структуру:

CASE WHEN THEN WHEN fest2THEN WHEN testa THEN [ELSE END CASE;

Здесь нет проверяемого выражения;

вместо этого каждое предложение WHEN содержит логическое выражение. Подобно оператору IF-THEN, если тестовое выражение оценивается как TRUE, то выполняется ствующая последовательность операторов. Следующий пример иллюстри рует использование оператора CASE с поиском. Отметим, что тестовые выражения не обязаны проверять один и тот же элемент.

— Этот пример содержится в файле SQL> DECLARE 2 v_Test1 NUMBER 2;

3 v_Test 4 BEGIN 5 CASE 6 WHEN v_Test1 = 1 THEN 7 ');

8 one!

9 WHEN v_Test1 > 1 THEN 11 > 1!

12 WHEN v_Test2 = THEN 15 ELSE 17 END CASE;

18 END;

19 / > 1!

Still > PL/SQL procedure successfully completed.

В этом примере показаны WHEN, имеющие в своем ставе более одного оператора. также: хотя v_Test2 равно и, следовательно, третье условие WHEN будет истинным, оно не выполняется, так как предыдущее условие уже было оценено как TRUE.

114 A Циклы В PL/SQL можно повторять операторы посредством циклов (loops). Цик лы подразделяются на четыре категории. Простые циклы, циклы WHILE и циклы FOR рассматриваются в последующих разделах. Курсорные цик лы FOR обсуждаются в главе 6.

Простые циклы Синтаксис простых циклов (основных циклов языка) таков:

LOOP END LOOP;

Последовательность операторов будет выполняться бесконечно дол го, так как в этом цикле отсутствует условие его завершения. Такое усло вие можно предусмотреть, если добавить оператор EXIT (выход), имеющий следующий синтаксис:

EXIT [WHEN условие] Рассмотрим блок, с помощью которого в таблицу вводится 50 строк:

пример содержится в файле DECLARE BINARY_INTEGER := 1;

BEGIN LOOP - Введем в таблицу строку с текущим значением - счетчика цикла.

INSERT INTO VALUES v_Counter := + - Условие выхода: когда счетчик станет > 50, цикл будет - завершен.

IF > 50 THEN EXIT;

END IF;

END LOOP;

END;

Оператор WHEN эквивалентен оператору условие EXIT;

END IF;

Основы PL/SQL Поэтому можно изменить приведенный блок, но его функционирова ние останется прежним:

— Этот пример в файле DECLARE BINARY_INTEGER := BEGIN LOOP - в таблицу строку с текущим значением •- счетчика цикла.

INSERT INTO VALUES v_Counter := + - Условие выхода: когда счетчик цикла станет > 50, цикл будет •- завершен.

WHEN > 50;

END LOOP;

END;

Циклы WHILE Синтаксис цикла WHILE (цикл условием продолжения) таков:

WHILE условие LOOP END LOOP;

Проверка происходит перед каждой итерацией (шагом) цикла.

Если условие истинно, выполняется последовательность операторов. Если же проверка условия дает ложное или NULL-значение, цикл завершается и управление программой передается оператору, следующему за операто ром END LOOP. Теперь перепишем рассматриваемый блок, применив цикл WHILE:

— Этот пример содержится в файле DECLARE BINARY_INTEGER := 1;

BEGIN - Проверяем счетчик цикла перед каждой итерацией - на предмет того, что значение счетчика меньше 50.

WHILE <= 50 LOOP INSERT INTO VALUES v_Counter ;

= + END LOOP;

END;

Чтобы прервать цикл и выйти из него, можно внутри цикла WHILE ис пользовать оператор EXIT EXIT WHEN.

Учтите, что если при первой условие цикла не истинно, цикл не выполняется ни разу. Если в нашем примере убрать инициализацию переменной то результатом проверки условия <= будет и в таблицу не будет введено ни одной строки:

Г] — Этот пример содержится в файле DECLARE BINARY_INTEGER;

BEGIN - Результатом проверки условия будет NULL, так как по - умолчанию счетчик v_Counter содержит NULL-значение.

WHILE v_Counter <= 50 LOOP INSERT INTO VALUES v_Counter END LOOP;

END;

Числовые циклы FOR Число итераций в простых циклах и циклах WHILE не известно зара нее — оно зависит от условий, заданных в циклах. В числовых же циклах FOR число итераций заранее определено. Синтаксис цикла FOR таков:

FOR [REVERSE] операторов;

END LOOP;

где — неявно создаваемая индексная переменная, и указывают число итераций, а — это содержимое цикла.

Границы цикла вычисляются один раз и определяют общее число ите раций, проходимых счетчиком цикла от нижней границы до верхней гра ницы. При этом счетчик каждый раз увеличивается на 1 до тех пор, пока цикл не завершится. Представим наш пример с помощью цикла FOR:

— Этот пример содержится в файле forloop.sql BEGIN FOR IN LOOP INSERT INTO VALUES END LOOP;

END;

Правила, определяющие область действия счетчика Счетчик (индекс) цикла FOR неявно объявляется как BINARY_INTEGER. Объявлять его ред циклом необязательно. Если он все же объявлен, индекс цикла скрыва ет внешнее объявление так же, как объявление переменной во внутреннем блоке скрывает ее объявление во внешнем блоке:

— Этот пример содержится в файле DECLARE v_Counter NUMBER := 7;

Основы PL/SQL BEGIN - Введем значение 7 в таблицу INSERT INTO VALUES - Этот цикл переобъявляет как BINARY_INTEGER, что - скрывает объявление как NUMBER.

FOR IN LOOP - Внутри цикла изменяется от 20 до 30.

INSERT INTO VALUES END LOOP;

- Еще раз введем значение 7 в таблицу temp_table.

INSERT INTO VALUES (v_Counter);

END;

Использование REVERSE Если в цикле FOR указывается ключевое слово REVERSE (обратный порядок), индекс цикла будет изменяться от верх ней границы до нижней. Обратите внимание, что в этом случае синтак сис остается прежним — нижняя граница по-прежнему указывается первой:

BEGIN FOR IN REVERSE LOOP - начнется с 50 и каждый раз будет уменьшаться на NULL;

END LOOP;

END;

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

DECLARE NUMBER := 10;

NUMBER := 40;

BEGIN FOR IN REVERSE.. LOOP INSERT INTO VALUES specified loop ranges');

END LOOP;

END;

Это позволяет динамически определять верхнюю и нижнюю границу.

Операторы GOTO и метки В языке программирования PL/SQL имеется оператор GOTO (перейти к). Его синтаксис:

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

Этот содержится в файле DECLARE BINARY_INTEGER := 1;

BEGIN LOOP INSERT INTO VALUES ' Loop v_Counter v_Counter + 1;

IF > 50 THEN GOTO END IF;

END LOOP;

INSERT INTO VALUES END;

Ограничения при использовании GOTO В PL/SQL на использование операторов GOTO налагаются определенные ограничения. Нельзя передавать управление программой во внутренний блок, цикл или оператор IF. Приведем пример:

BEGIN GOTO l_InnerBlock;

-- Незерно, так как нельзя передавать - управление во блок BEGIN END;

GOTO - Неверно, так как нельзя передавать - управление в оператор IF IF х > 3 THEN INSERT INTO END IF;

END;

Если бы это допускалось, то операторы внутри оператора IF могли бы быть выполнены, даже если бы условие IF не было истинным. В примере, выше, оператор INSERT выполнился бы даже тогда, когда х = 2.

Кроме того, запрещается передавать управление из одной последова тельности операторов условного оператора IF в другую:

Основы PL/SQL Q IF x > 3 THEN GOTO l_NextCondition;

ELSE END IF;

END;

Наконец, нельзя передавать управление из обработчика исключительных ситуаций обратно в текущий блок. Исключительные ситуации рассматри ваются в главе 7.

Q DECLARE BEGIN - Выберем одну строку в таблице rooms.

SELECT INTO v_Room FROM rooms WHERE rowid = 1;

INSERT INTO VALUES a row!

EXCEPTION WHEN THEN GOTO l_Insert;

- Неверно, так как нельзя передавать управление в - текущий блок END;

Помеченные циклы Циклы могут быть помечены. При этом метка может быть указана в опера торе EXIT для определения цикла, который нужно прервать. Например:

Q BEGIN FOR IN 50 LOOP FOR IN 10 LOOP IF > 40 THEN EXIT - выход из обоих циклов END IF;

END LOOP l_Inner;

END LOOP Если цикл помечен, имя метки можно указывать после оператора END LOOP, как показано в этом примере.

Рекомендации по применению GOTO При использовании операторов GOTO следует соблюдать осторожность.

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

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

NULL как оператор В некоторых случаях необходимо явно указывать, что никаких действий выполнять не нужно. Это можно сделать при помощи оператора NULL, который не приводит ни к каким действиям;

он служит лишь в качестве заполнителя. Например:

Этот пример содержится в файле DECLARE NUMBER 7;

BEGIN IF v_TempVar < 5 THEN INSERT INTO VALUES < 20 THEN NULL;

-- никаких действий не выполняется ELSE INSERT INTO (char_col) VALUES END IF;

END;

Прагмы Прагмы (pragma) — это директивы компилятора, подобные директивам и языка С. Они служат в качестве инструкций компилятору PL/SQL, который выполняет прагму во время компиляции блока. Напри мер, прагма (ограничить ссылки) устанавливает ограничения на способ использования SQL- операторов в некоторой функ ции (см. главу 10). Помимо компиляции функции обычным образом, ком пилятор должен проверить, какие установлены ограничения.

Прагмы — это еще одно средство, которое является общим для языков PL/SQL Ada.

Записи PL/SQL Скалярные типы (NUMBER, DATE и т.д.) предопределены в дуле STANDARD. Поэтому для использования скалярного типа в программе Основы PL/SQL нужно лишь объявить переменную этого типа. С другой стороны, состав ные типы определяются пользователем. Для применения составного типа необходимо сначала определить тип, а затем объявить переменные этого типа — аналогично синтаксису объявления подтипа (см. выше).

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

DECLARE VARCHAR(20);

VARCHAR2(20);

Эти три переменные являются логически связанными, так как ссыла ются на общие поля таблицы students. При объявлении типа записи для этих переменных между ними создается отношение, и ими можно мани пулировать как целым. Рассмотрим пример:

DECLARE /* Определим тип записи для хранения общей информации о студенте */ TYPE t_StudentRecord IS RECORD ( StudentID VARCHAR2(20), /* Объявим переменную этого типа */ Общий синтаксис определения типа записи:

TYPE RECORD ( fieldl [NOT NULL] [:= field2 [NOT NULL] [:= fieldn typen [NOT NULL] [:= где — имя нового типа, поля fieldl fieldn — имена полей записи, а типы... typen — типы соответствующих полей. Запись может иметь сколько угодно полей. Объявление каждого поля выглядит по сути так же, как объявление переменной вне записи, включая ограничения NOT NULL и начальные значения. Выражения... exprn задают начальное значение каждого поля. Как и для объявлений переменных вне записи, начальное значение и ограничение NOT NULL являются необязательны ми. В следующем разделе объявлений определяется тип записи и объявляются две записи этого типа:

Г) DECLARE TYPE IS RECORD ( Count NUMBER(4), Name := EffectiveDate DATE, Description VARCHAR2(45) NOT NULL := 122 Аналогично объявлениям, находящимся вне определения записи, если поле ограничено с помощью NOT NULL, оно должно иметь начальное значение. Любое поле без начального значения инициализируется как NULL. Можно использовать либо ключевое слово DEFAULT, либо := для определения значения по умолчанию.

Обратиться к полю внутри записи можно следующим образом:

В следующем примере показано, как можно обратиться к полям в запи сях и BEGIN /* SYSDATE встроенной функцией, которая возвращает текущие дату и время */ := SYSDATE;

:= 'Pesto END;

Подобная ссылка является значением выражения (rvalue) и поэтому может использоваться с любой стороны оператора присваивания.

Присваивание записей Чтобы присвоить одну запись другой, обе записи должны быть одного типа. Например, для предыдущих объявлений и следую щее присваивание законно:

:= Такое присваивание записей использует семантику копирования — зна чениям полей в v_Sample1 будут присваиваться значения соответствую щих полей в В случае же двух различных типов, имеющих одинаковые определения полей, записи нельзя присвоить друг другу. В следующем примере возникает ошибка expression is of wrong type" (выражение неверного Этот пример содержится в файле DECLARE TYPE t_Rec1Type IS RECORD ( NUMBER;

TYPE t_Rec2Type IS RECORD ( NUMBER;

v_Rec1 t_Rec1Type;

v_Rec2 t_Rec2Type;

BEGIN /* Хотя v_Rec1 и v_Rec2 имеют одинаковые имена и типы полей;

сами типы записей различны. Это недопустимое присваивание, порождающее ошибку Основы PL/SQL */ v_Rec2;

/* Однако поля имеют одинаковый тип, поэтому следующие присваивания будут законны. */ v_Rec1.Field1 := v_Rec2. Field2;

END;

Запись можно указывать в операторе SELECT. При этом данные из базы данных будут извлекаться и помещаться в запись. Поля записи дол жны соответствовать полям, выбираемым в запросе. Следующий пример иллюстрирует такое использование записей:

— Этот пример содержится в файле DECLARE - Определяем запись в соответствии с некоторыми полями таблицы students.

- Обратите внимание на использование атрибута для TYPE t_StudentRecord IS RECORD ( Major - Объявляем переменную для получения данных v_Student BEGIN - Извлекаем информацию о студенте с ID, равным 10000.

- Отметим, что запрос возвращает столбцы, соответствующие -- полям SELECT last_name, major INTO FROM students WHERE ID = 10000;

END;

позволяет также использовать записи в операторах INSERT и UPDATE для изменения данных в базе данных (см. главу Использование Довольно часто в PL/SQL для объявления записи применяются типы данных, соответствующие строке базы данных. Для этих целей PL/SQL предоставляет оператор Аналогично возвращает тип данных на основе определения таблицы. Например, та кое объявление, как DECLARE определяет запись, поля которой соответствуют столбцам таблицы rooms.

В частности, будет выглядеть следующим образом:

124 building VARCHAR2(15), description Как и в случае сюда не включается ограничение NOT NULL, определенное для столбца. Однако длина столбцов и CHAR, a также точность и масштаб для столбцов NUMBER учитываются.

Если определение таблицы изменяется, то изменяется вместе с ним. Подобно определяется всякий раз, когда анонимный блок передается среде выполнения PL/SQL, и всякий раз, когда компилируется хранимый объект.

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

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

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

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

declare х number;

у number;

begin if х < 10 then у := 7;

else у := 3;

end if;

end;

DECLARE v_Test NUMBER;

которая будет анализироваться v_Result NUMBER;

- Переменная для хранения результата BEGIN - Проанализируем и присвоим значение 7, если v_Test < 10.

IF v_Test < 10 THEN v_Result := 7;

ELSE v_Result := 3;

END IF;

END;

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

Основы PL/SQL В этом разделе рассматривается несколько моментов, касающихся сти ля программирования. Для написания хороших программ рекомендуется придерживаться предлагаемых советов. Все приведенные в книге приме ры составлены с учетом этих рекомендаций и служат иллюстрацией сти ля программирования на языке PL/SQL.

Комментарии Комментарии — это основной способ информирования читателя о том, каково назначение программы и как она работает. Рекомендуется распо лагать комментарии:

• В начале каждого блока и/или процедуры. В комментариях можно объ яснить, для чего предназначен блок (процедура). Это особенно важ но для процедур, так как в комментариях можно указать, какие параметры передаются в процедуру (входные параметры) и какие переменные или параметры возвращаются (выходные параметры).

Кроме того, рекомендуется указывать объекты базы данных, к кото рым обращается программа. В этом случае легко проследить зависи мости процедуры.

• При каждом объявлении переменной. Сообщайте, для чего она будет использоваться. Обычно достаточно однострочного комментария, например:

Security Number - (номер службы социального обеспечения США) • Перед важным разделом блока. Не нужно сопровождать коммен тариями каждый оператор, однако весьма полезен комментарий, по ясняющий назначение группы операторов. Используемый алгоритм можно понять по тексту программы, поэтому рекомендуется описы вать назначение алгоритма и для чего будут использоваться резуль таты, а не детали метода.

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

"О чем нужно знать программисту, видящему это в первый раз?" Учтите, что таким программистом можете стать вы сами через месяц-другой по сле написания Комментарий должен иметь определенный смысл и не повторять что очевидно из текста программы. К примеру, ниже приведен коммента рий, который не сообщает ничего нового по сравнению с тем, что написа но в программе PL/SQL, и поэтому практически бесполезен:

DECLARE v_Temp NUMBER := 0;

Присвоить значение О Однако следующий комментарий полезен, так как в нем говорится о назначении переменной Г] DECLARE 126 NUMBER := 0;

- Временная переменная, используемая в основном цикле Имена переменных Именам переменных следует придавать определенный смысл. Объявление х number;

ничего не говорит о том, в каких целях будет использоваться пере менная х. Однако объявление v_StudentID NUMBER(5);

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

Имя переменной может указывать на ее использование. Можно пред ложить такой способ именования переменных: буква, отделенная от оста льной части имени знаком подчеркивания. Например:

Г] программная переменная исключительная ситуация, определяемая пользователем тип, определяемый пользователем параметр процедуры или функции переменная, объявленная как CONSTANT (константа) Выделение заглавными буквами PL/SQL не учитывает регистра. Однако надлежащее использование про писных и строчных букв существенно повышает удобочитаемость про грамм. Рекомендуется придерживаться следующих правил:

• Зарезервированные слова пишутся прописными буквами (напри мер, BEGIN, DECLARE, • Встроенные функции пишутся прописными буквами (SUBSTR, COUNT, • Предварительно определенные типы пишутся прописными буквами (NUMBER(7,2), BOOLEAN, DATE).

• Ключевые слова SQL пишутся прописными буквами (SELECT, INTO, UPDATE, WHERE).

• Объекты базы данных пишутся строчными буквами (log_table, classes, students).

• Имена переменных пишутся с использованием символов обоих ров;

каждое слово в имени начинается с заглавной буквы (v_HireDate, e_TooManyStudents, Основы PL/SQL Структурирование текста Одним из наиболее простых способов, применяемых для структурирова ния текста, является разделителей (символов возврата карет ки, пробела и табуляции). Это повышает удобочитаемость программ.

Сравним две одинаковые вложенные конструкции IF-THEN-ELSE:

Г) IF х < у THEN IF z IS NULL THEN x := 3;

ELSE x := 2;

END IF;

ELSE x := 4;

END IF;

IF x < у THEN IF z IS NULL THEN x := 3;

ELSE x := 2;

END IF;

ELSE x := 4;

• END IF;

Рекомендуем следующие правила: начинать каждую строку в блоке с двух пробелов;

выделять отступом содержимое блока относительно клю чевых слов выделять отступом циклы и условные опера торы. Кроме того, выделяйте SQL-операторы, которые располагаются на нескольких строках, например:

SELECT id, INTO FROM STUDENTS WHERE id = 10002;

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

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

Если ранее был выработан какой-либо стиль программирования на языке С, то, скорее всего, этот стиль можно приспособить и для PL/SQL.

128 ГЛАВА Итоги В этой главе рассматривались основные элементы PL/SQL: структура блока PL/SQL, переменные и типы данных (скалярные, составные и выражения и операторы, правила преобразования типов дан ных и основные управляющие структуры. Кроме того, разговор шел о стиле программирования на PL/SQL, который помогает писать более по нятные и удобочитаемые программы. Теперь можно перейти к рассмот рению использования SQL-операторов в процедурных конструкциях.

Сборные конструкции обсуждаются в главе 8.

i ГЛАВА SQL в 130 структурированных запросов (SQL, Structured Query Language) определяет способы работы с данными в Oracle. Процедурные конструк ции, рассмотренные в предыдущей главе, становятся намного полезнее при их объединении с мощными средствами обработки информации, предлагаемыми SQL, так как это позволяет программам PL/SQL манипу лировать данными в Oracle. В этой главе говорится о том, какие SQL-опе раторы разрешено использовать в PL/SQL и какие операторы управляют транзакциями и тем самым обеспечивают согласованность данных.

Встроенные SQL-функции обсуждаются в главе 5.

Операторы SQL Операторы SQL можно подразделить на пять категорий. В таблице 4. представлены примеры операторов, относящихся к разным категориям.

Все SQL-операторы подробно описаны в руководстве "Server SQL Reference".

• С помощью операторов языка манипулирования данными (DML, Data Manipulation Language) можно модифицировать и запраши вать информацию, содержащуюся в однако нельзя изме нять структуру таблиц и других объектов.

• С помощью операторов языка определения данных (DDL, Data Defi nition Language) можно создавать, удалять и изменять структуру объектов схем. К операторам DDL относятся также команды, исполь зуемые для изменения полномочий на объекты схем.

• Операторы управления транзакциями обеспечивают согласован ность данных. SQL-операторы объединяются в логические транзак ции, которые выполняются либо успешно, либо неуспешно как единое целое.

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

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

SQL в PL/SQL Внимание Некоторые клиентские инструментальные средства предоставляют дополнительные команды. Эти команды действительны только в данной среде. Например, SQL *Plus предлагает такие команды, как spool (копирование в файл) и set (копирование содержимого буфера на экран). Рго*С предоставляет встроенные команды SQL, например allocate (выделение памяти для переменной курсора) и connect (создание соединения с базой данных). Дополнительная информация о клиентских инструментальных средствах представлена в главе 2.

Таблица 4.1. Категории SQL-операторов Категория Примеры SQL-операторов Язык манипулирования данными (DML) SELECT, INSERT, UPDATE, DELETE, EXPLAIN PLAN Язык определения данных (DDL) DROP, CREATE, ALTER, GRANT, REVOKE Управление транзакциями COMMIT, ROLLBACK, SAVEPOINT, SET TRANSACTION Управление сеансом работы ALTER SESSION, SET ROLE Управление системой ALTER SYSTEM Использование SQL в PL/SQL Из всех SQL-операторов в программах PL/SQL можно применять лишь операторы DML и операторы управления транзакциями. Операторы DDL использовать нельзя. Оператор EXPLAIN PLAN (объяснить план) — хотя он и относится к категории — применять также не разрешает ся. Чтобы пояснить смысл этих ограничений, рассмотрим принципы со здания программ PL/SQL.

В любом языке программирования привязка переменных может быть либо ранней, либо поздней. Привязка (binding) переменной — это процесс указания области памяти, соответствующей идентификатору программы.

В PL/SQL в процесс привязки входит также проверка базы данных на на личие полномочий, позволяющих обращаться к объектам схем. В том языке, где используется ранняя привязка (early binding), этот процесс осу ществляется на этапе компиляции программы, а в языке, где применяет ся поздняя привязка (late она откладывается до этапа выполнения программы. Ранняя привязка означает, что компиляция программы будет занимать большее время (так как при этом нужно привязывать перемен ные), однако выполняться такая программа будет быстрее, потому что привязка уже завершена. Поздняя привязка сокращает время компиля ции, но увеличивает время выполнения программы.

При разработке PL/SQL было принято решение об использовании ранней привязки, чтобы к моменту выполнения блока объекты базы дан ных были уже проверены и чтобы блок мог быть выполнен максимально быстро. Это вполне оправданно, поскольку блоки PL/SQL можно 132 ГЛАВА хранить в базе данных как процедуры, функции, модули и триггеры. Та кие объекты хранятся в скомпилированном виде, т.е. при необходимости их можно загрузить из базы данных и выполнить (см. главы 9 11). Имен но поэтому нельзя использовать операторы DDL. Оператор DDL модифи цирует объект базы данных, следовательно, полномочия на объект должны быть подтверждены вновь. Процесс подтверждения полномочий требует привязки идентификаторов, а это уже было сделано во время компиляции.

Для иллюстрации вышесказанного рассмотрим гипотетический блок PL/SQL:

BEGIN CREATE TABLE ( NUMBER, char_value INSERT INTO VALUES (10, END;

Чтобы скомпилировать этот блок, нужно привязать идентификатор В процессе привязки будет проверяться, существует ли указан ная таблица. Но пока блок не выполнен, таблица не существует. В резуль тате данный блок не может быть скомпилирован, ни тем более выполнен.

Операторы DML и операторы управления транзакциями — это SQL операторы, с помощью которых нельзя модифицировать объекты схем или полномочия на объекты схем, поэтому в PL/SQL можно использо вать только эти SQL-операторы.

Использование динамического SQL Тем не менее существует способ, обеспечивающий выполнение в PL/SQL всех допустимых операторов SQL, включая DDL. Это динамиче ский SQL. Он позволяет создавать оператор SQL динамически, во время выполнения программы, а затем проводить его синтаксический анализ и выполнение. Такой оператор до момента выполнения программы факти чески еще не создан, поэтому от компилятора PL/SQL не требуется при вязывать идентификаторы этого оператора, что дает возможность ском пилировать блок. Существуют два способа применения динамического SQL в PL/SQL: встроенный динамический SQL выше) и пакет К примеру, можно было бы воспользоваться динамическим SQL для выполнения оператора CREATE TABLE, рассмотренного в пре дыдущем блоке. Однако скомпилировать оператор INSERT не удастся, как таблица не будет существовать до выполнения блока. Решить эту проблему можно с помощью динамического SQL. Следующий блок испо льзует встроенный динамический SQL для создания таблицы temp_table и для последующего внесения в нее данных:

Г) BEGIN EXECUTE IMMEDIATE TABLE ( NUMBER, SQL в PL/SQL EXECUTE IMMEDIATE INTO temp_table char_value) VALUE(10, END;

Дополнительную информацию о динамическом SQL можно найти в главе 12.

DML в PL/SQL Допустимыми операторами DML являются SELECT (выбрать), INSERT (вставить), UPDATE (обновить) и DELETE (удалить). Каждый оператор действует в соответствии со своим названием: с помощью SELECT в таб лице выбираются указанные в условии WHERE;

посредством INSERT к таблице базы данных добавляются строки;

с помощью UPDATE модифицируются строки, указанные в условии WHERE;

с помощью DELETE эти строки удаляются. Помимо условия WHERE, в этих операто рах могут применяться и другие конструкции (см. ниже).

Когда SQL-операторы выполняются из SQL*Plus, результаты выводятся на экран (см. рис. 4.1). Для операторов UPDATE, INSERT и DELETE SQL*Plus возвращает число обработанных строк, а для оператора SELECT — строки, указанные в запросе.

File Edit Options SELECT first last name, major 2 FROM students 3 ORDER BV LAST_NAME MAJOR Scott Smith Computer Science Joanne Junebug Computer Science Manish Murgratroid Barbara Blues Economics Margaret Mason History Poll History Taller History Music Rose Riznit Music Ester Elegant Nutrition Rita Nutrition 11 rows selected.

UPDATE CLASSES 2 SET num credits - 3 WHERE department 4 AND course 1 updated.

commit;

Commit complete.

J Рис. Результаты выполнения SQL-операторов в SQL*Plus 134 ГЛАВА Рассмотрим оператор UPDATE, приведенный на рис.

UPDATE CLASSES SET = WHERE department AND course = Все значения, используемые для изменения содержимого таблицы classes, жестко программируются, т.е. они известны во время написания этого опе ратора. В PL/SQL ограничения на применение переменных отсутствуют.

Переменные могут указываться в любом месте SQL-оператора, где разре шены выражения. Переменные, используемые таким образом, называют ся переменными присваивания или переменными привязки (bind variable).

Например, в приведенном операторе UPDATE можно заменить жестко заданное значение, обозначающее число зачетов, переменной привязки:

•- Этот пример содержится в файле DECLARE BEGIN /* Присвоим значение переменной */ := 3;

UPDATE CLASSES SET = v_NumCredits WHERE department = AND course = END;

Выходные данные запросов также можно сохранить в переменных. В SQL-операторе разрешается заменять переменными только выражения.

Особенно отметим, что имена таблиц и столбцов должны быть известны.

Дело в том, что при ранней привязке имена объектов Oracle должны быть известны во время компиляции. По определению, значение пере менной до выполнения программы неизвестно. Чтобы обойти это огра ничение, можно вновь воспользоваться динамическим SQL.

SELECT С помощью оператора SELECT данные выбираются в базе данных и запи сываются в переменные PL/SQL. Общий вид оператора SELECT приведен ниже.

• FROM, условие WHERE SQL в PL/SQL Каждый из компонентов этого оператора описывается в таблице.

Предложение SELECT Описание Выбранный столбец (или выражение). Каждый элемент списка выбора отделяется запятой и при желании может быть идентифицирован с помощью псевдонима. Полный набор элементов списка выбора называется списком выбора (select list).

Символ * является кратким условным обозначением всей строки.

При использовании выбираются все поля строки таблицы в том порядке, в котором они определены.

Переменная Переменная PL/SQL, в которую заносится выбранный столбец.

Каждая переменная должна быть совместима по типу с соответствующим элементом списка выбора. Число элементов списка выбора и выходных переменных должно совпадать.

Может использоваться вместо списка переменных. Запись должна содержать поля, которые соответствуют списку выбора. Запись обеспечивает более простое управление возвращаемыми данными.

При помощи записей связанные поля группируются в одну синтаксическую единицу, поэтому к полям записи можно обращаться как к единому целому либо по отдельности (см. Главу 3). Если в качестве списка выбора указан символ *, то запись может быть определена как Определяет таблицу, из которой выбираются данные. Один запрос может выбирать данные из более чем одной таблицы, в этом случае ссылки на таблицу разделяются запятыми. Запрос такого типа называется соединением. не обязательно должна быть именем таблицы базы данных. Это может быть синоним либо таблица, принадлежащая удаленной базе данных, на которую указывает связь баз данных, представление, столбец вложенной таблицы и выше) или inline-представление (см. ниже раздел "Ссылки на Условие WHERE Критерий запроса, С помощью этого условия задается строка, которая будет возвращена запросом. Условие WHERE состоит из логических условий, соединенных знаками логических операций (см. ниже раздел "Предложение WHERE").

Внимание В операторе SELECT можно использовать различные конструкции, в частности ORDER BY (упорядочить по) и GROUP BY (сгруппировать по). Операторы SELECT могут объединяться с операторами множеств, такими как UNION и MINUS. За более детальной информацией обращайтесь к справочному руководству Server SQL Reference".

При помощи оператора SELECT, описанного выше, можно выбрать не более одной строки. Заданный критерий выбора будет сопоставляться с каждой строкой таблицы, и если условию будет удовлетворять несколько строк, PL/SQL вернет сообщение об ошибке:

136 ГЛАВА Single-row query returns more than one row (Однострочный запрос возвращает более одной строки) В этом случае следует воспользоваться курсором и выбрать каждую строку по отдельности (см. главу 6). Следующий пример показывает два различных оператора SELECT:

Г) -- Этот пример содержится в файле DECLARE v_Course BEGIN - Выберем одну запись в таблице students и сохраним ее в - переменной v_StudentRecord. Обратите внимание, что - WHERE удовлетворяет только одна строка таблицы.

- Запрос возвращает все поля таблицы - students (так как указан символ поэтому запись, в которую - считывается информация, определена как SELECT INTO v_StudentRecord FROM students WHERE id = 10000;

- Выберем два поля в таблице classes и сохраним их в переменных - и Условию WHERE вновь удовлетворяет только - одна строка таблицы.

SELECT department, course INTO v_Course FROM classes WHERE = 20003;

END;

INSERT Синтаксис оператора INSERT приведен ниже. Обратите внимание, что в операторе отсутствует условие WHERE.

( • VALUES SQL в PL/SQL Здесь указывает на таблицу — на столбец этой таблицы, а выражение является выражением SQL или PL/SQL, как это было определено в предыдущей главе. Ссылки на табли более подробно обсуждаются ниже. Если в операторе INSERT имеется то список выбора должен соответствовать столбцам, в которые вносится информация. Запрос такого типа называется подзап росом, так как он находится внутри другого оператора SQL.

Внимание Подобно SELECT, INSERT может иметь и другие формы.

Например, можно использовать подзапрос как часть предложения VALUES (см. руководство "Server SQL Reference").

Приведем пример использования оператора INSERT:

••- Этот пример содержится в файле DECLARE BEGIN - Считаем идентификационный номер нового студента.

SELECT INTO FROM dual;

•- Добавим строку в таблицу students.

INSERT INTO students (id, VALUES (v_StudentID, •- Добавим вторую строку, но при этом воспользуемся - последовательным номером непосредственно в операторе INSERT.

INSERT INTO students VALUES (student_sequence.NEXTVAL, END;

Ниже приведен пример недопустимого INSERT, так как список выбора в подзапросе не соответствует столбцам, в которые вводятся данные. В ре зультате выполнения этого оператора возвращается ошибка:

Too many values" (Слишком много значений).

INSERT INTO rooms SELECT * FROM classes;

Следующий пример правильный. Здесь при помощи ввода второй ко пии каждой из строк удваивается размер таблицы temp_table:

INSERT INTO SELECT * FROM В версии допускающей применение объектов, в операторе INSERT можно применять дополнительную конструкцию REF INTO. При использовании этой конструкции с объектными таблицами она будет воз вращать ссылку на объект, в который вводится информация (см. главу 138 ГЛАВА UPDATE Оператор UPDATE имеет следующий синтаксис:

выражение WHERE • CURRENT Здесь указывает на обновляемую таблицу (или пред ставление), — на столбец, значение которого будет измене но, а выражение — это выражение SQL, как определено в главе 3. Если в операторе содержится то список выбора должен соот ветствовать столбцам команды SET (установить). Специальный синтак сис OF используется вместе с определением курсора (см. главу 6).

Ниже приводится пример использования оператора UPDATE:

— Этот пример содержится в файле DECLARE NUMBER := 3;

BEGIN - При помощи оператора UPDATE к значениям полей - всех студентов, профилирующей дисциплиной которых - является история, будет добавлено значение UPDATE students SET = + WHERE major = V_Major;

- Этот оператор UPDATE модифицирует два столбца •- для всех строк UPDATE temp_table SET = char_col = END;

DELETE При помощи оператора DELETE удаляются строки из таблицы базы дан ных. Условие WHERE оператора указывает на те строки, которые дол жны быть удалены. Синтаксис оператора DELETE приведен на рисунке ниже.

SQL в PL/SQL DELETE • CURRENT курсор • Здесь указывает на таблицу Oracle (или некоторое представление), a определяет группу строк, которые будут удалены. Специальный синтаксис OF используется вместе с определением курсора (см. главу 6). О ссылках на таблицы и об условии WHERE рассказывается в следующем разделе.

Ниже приводится блок, иллюстрирующий применение оператора DELETE:

•- Этот пример содержится в файле DECLARE NUMBER;

BEGIN := 10;

- Удалим те учебные группы, в которых число зарегистрированных -- студентов слишком мало.

DELETE FROM classes WHERE < - Удалим всех студентов-экономистов, которые еще не сдали ни -- одного зачета.

DELETE FROM students WHERE current_credits = AND major = END;

Внимание Первый оператор DELETE в приведенном блоке, а также некоторые примеры в следующем разделе будут инициировать нарушение ограничений, если таблицы были созданы с помощью сценария sql. Это связано с ограничениями ссылочной целостности таблицы classes. Дополнительную информацию об ограничениях ссылочной целостности можно найти в "Server SQL Reference".

Условие WHERE В состав операторов SELECT, UPDATE и DELETE в качестве важной час ти входит условие WHERE. Оно определяет активный набор (active set) множество строк, которое возвращается запросом SELECT или на кото рое воздействует оператор UPDATE или DELETE.

Предложение WHERE строится из условий, соединенных логическими операциями AND (и), OR (или) и NOT (не). Эти условия обычно имеют форму сравнений, например:

140 -- Этот пример содержится в файле DECLARE BEGIN - Удалим все компьютерные группы DELETE FROM classes WHERE department = END;

Приведенный блок удалит все строки таблицы classes, для которых за данное истинно (т.е. значение поля department равно При проведении сравнений следует обращать внимание на несколько момен тов, в том числе на имена переменных и на способ сравнения символов.

Имена переменных Представим себе, что в предыдущем блоке имя переменной изменено с на department:

— Этот пример содержится в файле DECLARE Department CHAR(3);

BEGIN Department - Удалим все компьютерные группы DELETE FROM classes WHERE department = Department;

END;

Это простое изменение оказывает значительное влияние на результа ты выполнения оператора: из таблицы classes будут удалены все а не только те, у которых значение факультета равно Все дело в спосо бе осуществления синтаксического анализа идентификаторов SQL- опе ратора. Когда PL/SQL встречает условие вида = эти выражения вначале проверяются на соответствие столбцам таблицы, над которой выполняется операция. Затем проверяется наличие в блоке PL/SQL переменных. PL/SQL безразличен к регистру символов, поэто му в нашем блоке как department, так и Department ассоциируются со столб цом таблицы classes, а не с переменной. Указанное условие истинно для каждой строки таблицы, поэтому все строки будут удалены.

Если для блока метка, то для переменной и столбца можно испо льзовать одинаковые имена, но в этом случае надо указать метку при ссылке на переменную. Ниже приведен блок, выполнение которого дает нужный эффект, т.е. удаляются только те строки, в которых department = Этот пример содержится в файле DECLARE SQL в PL/SQL Department CHAR(3);

BEGIN Department - Удалим все компьютерные группы DELETE FROM classes WHERE department = END;

Такой способ допустим, использование одного и того же имени для переменной PL/SQL и для столбца таблицы считается плохим стилем программирования (см. главу 3).

Сравнение символов В Oracle при сравнении двух символьных значений могут использоваться два метода: сравнение с дополнением пробелами и сравнение без допол нения пробелами. Эти два метода различаются способом сравнения строк символов с разной длиной. Предположим, что имеются две строки символов — и string2. При сравнении с дополнением пробелами при меняется следующий алгоритм:

1. Если длины строк различны, то сначала более короткое значение дополняется пробелами, чтобы строки имели одинаковую длину.

2. Строки сравниваются посимвольно, начиная слева. Допустим, что сравниваются из stringl и из string2.

3. Если < ASCII(char2), то stri ngl < string2. Если > ASCII(char2), то stringl > string2. Если = ASCII(char2), то берутся следующие символы stringl и string2.

4. Если достигнут конец каждой из строк, то строки равны.

При использовании данного метода следующие условия будут истинными:

Г) 'abc' = 'abc' 'abc ' = - Обратите внимание на конечные пробелы в первой 'ab' < > 'abcc' Алгоритм сравнения строк символов без дополнения пробелами выглядит несколько иначе:

1. Строки сравниваются посимвольно, начиная слева. Допустим, что сравниваются charl — символ из stringl и char2 — символ из string2.

2. Если < ASCII(char2), то stringl < string2. Если > ASCII(char2), то stringl > string2. Если = ASCII(char2), то берутся следующие символы stringl и string2.

3. Если конец stringl достигается раньше конца string2, то stringl < string2. Если конец достигается раньше конца stringl, то stringl > string2.

4. Если достигнут конец каждой из строк, то строки равны.

142 При использовании данного метода сравнения символов будут истин ны следующие условия:

= 'ab' < > Сравнение, приведенное ниже, даст ложный результат, так как длина строк различна. Именно в этом заключается основное различие двух ме тодов сравнения символов.

Г) ' = •- Обратите внимание на конечные пробелы в первой строке.

Так когда же какой метод следует использовать? В PL/SQL метод срав нения с дополнением пробелами применяется только в том случае, когда оба сравниваемых значения имеют фиксированную длину. Если же одно из значений имеет переменную длину, то применяется сравнение без допол нения пробелами. Данные типа CHAR имеют фиксированную длину, а дан ные типа — переменную. Считается, что символьные литералы (заключенные в одиночные кавычки) всегда имеют фиксированную длину.

Если оператор не оказывает воздействия на нужные строки, проверь те типы данных, в условии WHERE. Ниже приводится блок, в результате выполнения которого ни одна строка удалена не будет, так как переменная имеет тип а не CHAR.

Г) — Этот пример содержится в файле DECLARE v_Department VARCHAR2(3);

- Удалим все компьютерные группы DELETE FROM classes WHERE department = END;

Столбец department таблицы classes имеет тип CHAR. Поэтому для всех компьютерных групп значение department будет равно ' (обратите внимание на конечный пробел). Значение переменной рав но (конечный пробел отсутствует), и она имеет тип данных перемен ной длины, поэтому оператор DELETE не оказывает никакого влияния на строки.

Для получения нужного эффекта от условия WHERE следите за тем, чтобы переменные в блоке PL/SQL имели те же типы, что и столбцы базы данных, с которыми сравниваются переменные. Это можно гаран тировать, если использовать атрибут Массовое связывание Операторы SQL в блоках PL/SQL посылаются системе поддержки SQL.

Система поддержки SQL в свою очередь может посылать данные назад системе поддержки PL/SQL. Например, рассмотрим следующий блок:

SQL в PL/SQL -- Этот пример содержится в файле DECLARE TYPE t_Numbers IS TABLE OF INDEX BY BINARY_INTEGER;

TYPE t_Chars IS TABLE OF INDEX BY BINARY_INTEGER;

BEGIN -- Заполним массивы 500 строками FOR IN LOOP := v_Count;

:= || v_Count;

END LOOP;

- И введем их в базу данных FOR v_Count IN LOOP INSERT INTO VALUES END LOOP;

END;

Внимание блок использует индексную таблицу PL/SQL, которая аналогична массиву С или Java. Дополнительную информацию об индексных таблицах и других типах сборных конструкций можно найти в главе 8.

При выполнении этого блока в таблицу вставляется 500 строк.

Однако каждая операция INSERT делается отдельно. Это приводит к переключениям контекста между PL/SQL и SQL.

переключает контекст только один раз, передавая всю табли цу PL/SQL в систему выполнения SQL за один шаг, который называется массовым связыванием (bulk bind). Массовые связывания выполняются с помощью оператора например:

— Этот пример содержится в файле DECLARE TYPE IS TABLE OF INDEX BY BINARY_INTEGER;

TYPE t_Chars IS TABLE OF char_col%TYPE INDEX BY BINARY_INTEGER;

v_Numbers v_Chars t_Chars;

BEGIN - Заполним массивы 500 строками FOR v_Count IN 1..500 LOOP v_Chars(v_Count) := number ' || v_Count;

END LOOP;

144 ГЛАВА — И вставим их в базу данных с помощью массового связывания FORALL v_Count IN INSERT INTO VALUES END;

' Массовые связывания могут использоваться также с запросами для из влечения за один раз более одной строки активного набора (см. главу 12).

Предложение RETURNING В ряде случаев необходима информация о строках, модифицированных оператором DML, — например, rowid вновь вставленной строки. Одним из способов является выполнение SELECT после оператора DML. Однако для этого требуются второй оператор SQL и обращение к ядру предлагает другое решение: предло жение RETURNING. Его можно применить в конце любого оператора и используется оно для получения информации о только что обра ботанной строке или строках. Синтаксис RETURNING:

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

(Псевдостолбцы, в том числе рассматриваются ниже в разделе Следующий сеанс SQL*Plus иллюстрирует примене ние предложения RETURNING:

— Этот пример содержится в файле SQL> DECLARE 2 ROWID;

3 v_FirstName students.

4 students.

5 v_ID ID%TYPE;

6 BEGIN - Вставим новую строку в таблицу students и получим 8 - rowid новой строки.

9 INSERT INTO students 10 (ID, major, current_credits) 11 VALUES 12 'Xavier', 0) 13 RETURNING rowid INTO 15 inserted rowid is 17 - Модифицируем строку, чтобы увеличить количество зачетов, - и получим имя и фамилию SQL в PL/SQL 19 UPDATE students 20 SET current_credits = current_credits + 21 WHERE rowid = v_NewRowid 22 RETURNING first_name, INTO 24 || || || 26 - Удалим строку и получим ID удаленной строки 27 DELETE FROM students 28 WHERE rowid = 29 RETURNING ID INTO v_ID;

31 of new row was v_ID);

32 END;

33 / Newly inserted rowid is AAAF3MAAFAAAAATAAM Xavier ID of new row was PL/SQL procedure successfully completed.

Ссылки на таблицы Все операции DML обращаются к таблицам. Общий вид ссылки на табли цу можно представить следующим образом:

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

Чтобы соединение с базой данных, необходимо указать имя пользователя и пароль для конкретной схемы. SQL-операторы, вы полняемые во время сеанса работы, будут обращаться к этой схеме по умолчанию. Если ссылка на таблицу не уточнена, например:

Г) UPDATE students SET major = WHERE id = 10005;

то имя таблицы (в этом примере — students) должно указывать на таб лицу, которая принадлежит схеме, заданной по умолчанию. Если это не так, возвращается сообщение об ошибке:

Г] table or view does not exist (Таблица или представление не существует) или Г] must be declared (Необходимо объявить идентификатор) 146 Схема по умолчанию — это схема, с которой пользователь соединяется до начала выполнения каких-либо команд SQL или PL/SQL. Если таблица находится в другой схеме, к ней можно обратиться при помощи имени схемы, например:

UPDATE SET major = WHERE id = 10005;

Данный оператор UPDATE будет выполнен в том случае, если соеди нение установлено со схемой example или с другой схемой, которой пре доставлена привилегия UPDATE на таблицу students.

Внимание и последующие версии предоставляют функцию которая может быть использована для динамического создания ссылок на таблицы из хранимых вложенных таблиц или других выражений (см. главу 8). Oracle9't позволяет также применять табличные функции для динамической генерации данных (см. главу 12).

Связи баз данных Если в системе установлено программное средство то можно использовать связи баз данных. баз данных (database link) — это ссыл ка на удаленную базу данных, которая может быть размещена в иной сис теме, нежели локальная база данных. Связь баз данных создается с помощью следующего оператора DDL:

CREATE DATABASE LINK CONNECT TO IDENTIFIED BY USING Имя связи баз данных подчиняется обычным правилам, установлен ным для идентификаторов баз данных. Имя пользователя и пароль иден тифицируют схему удаленной базы данных, a является строкой соединения с удаленной базой данных. Предположим, что нуж ные схемы созданы, и средство установлено. Создадим связь баз данных:

CREATE DATABASE LINK CONNECT TO example IDENTIFIED BY example USING Более подробную информацию об установке и конфигурировании можно найти в руководстве User's Guide and Referen ce". С учетом созданной связи обновим удаленную таблицу students:

UPDATE SET major = WHERE id = 10005;

SQL в PL/SQL Когда связь с базой данных используется как часть некоторой транзак ции, эту транзакцию распределенной (distributed transaction), так как с ее помощью модифицируется несколько баз данных. За более по дробными сведениями о распределенных транзакциях, об их назначении и о работе с ними обращайтесь к справочному руководству "Server SQL Reference".

Синонимы Структура ссылок на таблицы может быть довольно сложной, особенно когда в ссылках указываются схемы связи баз данных. Для упроще ния работы в Oracle разрешается создавать синонимы для сложных ссы лок. Синоним (synonym), по существу, дает ссылке на таблицу другое имя, подобно тому, как псевдоним (alias) дает новое имя элементу списка выбо ра. Синоним является объектом словаря данных и создается при помощи DDL-оператора CREATE SYNONYM:

CREATE SYNONYM FOR Здесь — это имя синонима, а ссылка — ссылка на объект схемы. Объектом схемы может быть таблица, процедура, последователь ность или другой объект базы данных. Например:

Г) CREATE SYNONYM FOR С учетом этого синонима перепишем наш распределенный оператор UPDATE:

UPDATE SET major = WHERE id = 10005;

Внимание Создание синонима не дает каких-либо привилегий объекту, на который происходит ссылка;

синоним — это всего лишь альтернативное имя объекта.

Псевдостолбцы Псевдостолбцы — это дополнительные функции, которые можно вызвать только из SQL-операторов. Синтаксически они аналогич ны столбцам таблиц, однако реально совсем не похожи на них. Их скорее можно назвать частью процесса выполнения SQL-операторов.

CURRVAL и NEXTVAL Псевдостолбцы CURRVAL (текущее значение) и NEXTVAL (следующее значение) применяются в последовательностях. (sequ ence) — это объект Oracle, который используется для генерирования уникальных чисел. Последовательность создается с помощью DDL-коман ды CREATE SEQUENCE. После того как последовательность создана, к ней можно обратиться следующим образом:

нос С или где — это имя последовательности. CURRVAL возвра щает текущее значение последовательности, a увеличивает ее и возвращает новое значение. Как CURRVAL, так и NEXTVAL возвраща ют значения, имеющие тип NUMBER. Доступ с CURRVAL в данном сеан се возможен только после выполнения хотя бы одного NEXTVAL.

Значения последовательностей могут быть использованы в списке вы бора запроса, в предложении VALUES оператора INSERT и в предложе нии SET оператора UPDATE. Однако их нельзя указывать в условиях WHERE и в процедурных операторах PL/SQL. Ниже приведены приме ры правильного применения CURRVAL и NEXTVAL:

г] — Этот пример содержится в файле CREATE SEQUENCE student_sequence START WITH INCREMENT BY 1;

- В качестве значения идентификатора в этом операторе будет — использоваться число 10000.

INSERT INTO students (id, major, VALUES - В качестве значения идентификатора в этом операторе будет -- использоваться число INSERT INTO students (id, major, current_credits) VALUES 4);

Следующий сеанс иллюстрирует применение CURRVAL (предполагается, что для создания строк таблицы students исполь зовался сценарий sql):

SQL> SELECT 2 FROM dual;

CURRVAL SQL в PL/SQL LEVEL (уровень) применяется в операторах SELECT для просмотра таб лицы с учетом иерархического при этом используются конструк ции START WITH (начать с) и CONNECT BY (соединиться Псевдостолбец LEVEL возвращает текущий уровень дерева в виде значе ния типа NUMBER. Более подробно об этом говорится в руководстве "Server SQL Reference".

ROWID Псевдостолбец ROWID (идентификатор строки) используется в списках выбора запросов и возвращает идентификатор конкретной строки.

Внешним форматом ROWID является строка символов (см. главу Псев достолбец возвращает значение типа ROWID. К примеру, следую щий запрос возвращает идентификаторы всех строк таблицы rooms:

SQL> SELECT ROWID 2 rooms;

ROWID AAAF3PAAFAAAABDAAA AAAF3PAAFAAAABDAAB AAAF3PAAFAAAABDAAC AAAF3PAAFAAAABDAAD AAAF3PAAFAAAABDAAE AAAF3PAAFAAAABDAAF AAAF3PAAFAAAABDAAG AAAF3PAAFAAAABDAAH AAAF3PAAFAAAABDAAI 9 rows Внимание Форматы ROWID, используемые в и различны.

организованные таблицы (новые в также имеют иной формат. Более того, базы данных, отличные от Oracle, доступные через шлюз, могут иметь другой формат ROWID. Однако внешним форматом для всех ROWID является строка символов (см. главу 3).

ROWNUM Псевдостолбец ROWNUM возвращает номер текущей строки запроса. Он полезен для ограничения общего числа строк и используется в первую очередь в условиях WHERE запросов и в предложениях SET операторов UPDATE. Значение, возвращаемое ROWNUM, имеет тип NUMBER. На пример, следующий запрос возвращает только две первые строки табли цы students:

SELECT * FROM students 150 WHERE ROWNUM 3;

первой строки равен ROWNUM второй строки — 2 и т.д.

Значение ROWNUM присваивается строке до выполнения сортировки строк (посредством ORDER BY). В результате нельзя пользоваться ROWNUM для считывания старших строк, расположенных в заданном порядке. Рассмотрим оператор:

SELECT FROM students WHERE ROWNUM < BY В результате выполнения этого оператора будут возвращены две стро ки таблицы students, упорядоченной по столбцу Однако вовсе не обязательно, что это будут две первые строки в общем порядке сорти ровки. Чтобы гарантировать выбор нужных строк, для этого запроса сле дует создать курсор и считать только две первые строки (см. главу 6).

Также можно использовать встроенное (inline) представление с ORDER BY (см. "Server SQL Reference").

REVOKE и привилегии Такие операторы DDL, как GRANT (предоставить) и REVOKE (отменить), нельзя использовать непосредственно в PL/SQL, — они служат для опреде ления возможности выполнения других SQL-операторов. Чтобы выпол нить над таблицей Oracle некоторую операцию, например INSERT или DELETE, необходимо иметь соответствующие полномочия, которые пре доставляются и отменяются с помощью SQL-команд GRANT и Объектные и системные привилегии Существуют привилегии двух различных видов: объектные и системные.

Объектная привилегия (object privilege) разрешает выполнение определен ной операции над конкретным объектом (например, над таблицей). Сис темная привилегия (system privilege) разрешает выполнение операций над целым классом объектов.

В таблице 4.2 представлены объектные привилегии.

Объектные привилегии DDL — ALTER (изменить), INDEX (индексиро вать), REFERENCES (ссылки) — нельзя применять непосредственно в PL/SQL (за исключением динамического SQL), так как они разрешают выполнение операций DDL над определенным объектом.

Существует системных привилегий, соответствующих практически всем возможным операциям DDL. Например, системная привилегия CREATE TABLE позволяет ее обладателю создавать таблицы.

Системная CREATE ANY TABLE дает возможность создавать таблицы в других схемах. Системные привилегии представлены в руко водстве "Server SQL Reference".

SQL в PL/SQL Таблица 4.2. Объектные привилегии SQL Объектная Типы объектов Описание привилегия ALTER Таблицы, последовательности Обладателю этой привилегии разрешается выполнять над объектом оператор ALTER (например, ALTER TABLE).

DELETE Таблицы, представления Обладателю этой привилегии и обновляемые материализованные разрешается выполнять над объектом представления оператор DELETE.

EXECUTE Процедуры, функции, модули Обладатель этой привилегии может и объектные типы выполнять хранимый объект PL/SQL (см. главы 9 — INDEX Таблицы Обладатель этой привилегии может создать индекс для таблицы с помощью команды CREATE INDEX.

INSERT Таблицы, представления Обладателю этой привилегии разрешается и обновляемые материализованные выполнять над объектом оператор INSERT.

представления ON COMMIT Материализованные Обладателю этой привилегии разрешается представления создавать для указанной таблицы материализованные представления, обновляемые при выполнении commit.

QUERY Материализованные Обладателю этой привилегии разрешается представления создавать для указанной таблицы материализованные представления, обновляемые при запросе.

Каталоги Обладателю этой привилегии разрешается читать из указанного каталога.

REFERENCES Таблицы Обладатель этой привилегии может создавать ссылается на таблицу.

SELECT Таблицы, представления, Обладателю этой привилегии разрешается последовательности, выполнять над объектом оператор SELECT.

материализованные представления Объектные типы Обладателю этой привилегии разрешается создавать подтипы для указанного типа, если супертип имеет права вызывающей стороны.

UPDATE Таблицы, представления Обладателю этой привилегии и обновляемые материализованные разрешается выполнять над объектом представления оператор UPDATE.

Доступна в и выше Доступна в и выше Доступна в Oracle9i и выше 152 GRANT и REVOKE Оператор GRANT предоставляет другой схеме доступ к привилегии, а оператор REVOKE запрещает доступ, разрешенный оператором GRANT.

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

GRANT Для объектных привилегий синтаксис оператора GRANT таков:

GRANT привилегия ON объект ТО [WITH GRANT где привилегия — это нужная привилегия, объект — это объект, к которому разрешается доступ, а — пользователь, получающий привилегию. Для примера предположим, что — это схема базы дан ных. Тогда оператор GRANT может выглядеть следующим образом:

GRANT SELECT ON classes TO userA;

Если указывается параметр WITH GRANT OPTION (с возможностью предоставления привилегий), то пользователь userA будет иметь возмож ность и сам предоставлять привилегии другим пользователям. В операто ре GRANT можно указывать несколько привилегий, например:

GRANT UPDATE, DELETE ON students TO userA;

Для системных привилегий синтаксис оператора GRANT таков:

GRANT [WITH ADMIN где привилегия — это предоставляемая системная привилегия, а — пользователь, получающий привилегию. Если в оператор включается параметр WITH ADMIN OPTION (с возможностью администри рования), то будет иметь возможность предостав лять привилегии другим пользователям. Например:

Г] GRANT CREATE TABLE, ALTER ANY PROCEDURE TO userA;

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

GRANT является оператором DDL, поэтому результаты его выполнения сказываются немедленно, и после того как он выполнен, осуществляется неявное завершение (COMMIT) транзакции.

REVOKE Для объектных привилегий синтаксис оператора REVOKE таков:

REVOKE привилегия ON объект FROM [CASCADE CONSTRAINTS] где привилегия — это отменяемая привилегия, объект — это объект, на кото рый была предоставлена привилегия, а — пользова тель, имевший эту привилегию. Например:

SQL в PL/SQL REVOKE SELECT ON classes FROM userA;

Если в оператор включена конструкция CASCADE CONSTRAINTS (ка скадные ограничения) и отменяется привилегия REFERENCES, удаляют ся также все ограничения ссылочной целостности, созданные обладателем этой привилегии. Ключевое слово FORCE используется при отмене при вилегии EXECUTE для объектного типа с табличными зависимостями.

В одном операторе можно отменять несколько привилегий:

REVOKE UPDATE, DELETE, INSERT ON students FROM userA;

Для системных привилегий синтаксис оператора REVOKE таков:

REVOKE привилегия FROM где привилегия — это отменяемая системная привилегия, а — пользователь, который более не будет иметь эту привилегию.

Например:

REVOKE ALTER TABLE, EXECUTE ANY PROCEDURE FROM userA;

Роли В больших системах Oracle, в которых работает множество пользовате лей, управление привилегиями — сложная задача. Для ее упрощения мож но использовать такое функциональное средство Oracle, как роли.

(role) является, по существу, совокупностью привилегий, как объектных, так и системных. Рассмотрим следующую группу операторов:

CREATE ROLE table_query;

GRANT SELECT ON students TO table_query;

GRANT SELECT ON classes TO table_query;

GRANT SELECT ON rooms TO table_query;

Роль table_query имеет привилегии SELECT на три различные таблицы.

Теперь можно предоставить эту роль другим пользователям:

GRANT TO userA;

GRANT TO userB;

Теперь привилегии SELECT на три таблицы имеют пользователи и Это упрощает администрирование: ведь без применения роли при шлось бы шесть раз предоставлять привилегии пользователям.

В Oracle имеется предопределенная роль PUBLIC (общая), которая ав томатически предоставляется каждому пользователю. Поэтому выполне ние оператора Q GRANT ТО PUBLIC;

одновременно предоставляет указанную привилегию всем пользователям Oracle.

В Oracle предварительно определен и ряд других ролей, в которые включены часто применяемые системные привилегии. Список этих ро лей для приведен в таблице 4.3. Предопределенный пользова тель Oracle с именем SYSTEM автоматически получает все эти роли.

154 Таблица 4.3. Предопределенные системные роли Имя роли Предоставленные привилегии CONNECT ALTER SESSION, CREATE CLUSTER, CREATE DATABASE LINK, CREATE SEQUENCE, CREATE SESSION, CREATE SYNONYM, CREATE TABLE, CREATE VIEW RESOURCE CREATE CLUSTER, CREATE CREATE OPERATOR, CREATE PROCEDURE, CREATE SEQUENCE, CREATE TABLE, CREATE TRIGGER, CREATE TYPE DBA Все системные привилегии (с ADMIN OPTION;

поэтому эти привилегии могут быть предоставлены вновь), а также EXP FULL DATABASE и IMP_FULL_DATABASE EXP FULL DATABASE ADMINISTER RESOURCE, BACKUP ANY TABLE, EXECUTE ANY PROCEDURE, EXECUTE ANY TYPE, SELECT ANY TABLE, а также INSERT, UPDATE, DELETE для системных таблиц incexp, и Внимание Oracle не гарантирует, что эти роли будут предопределены в будущих версиях.

Обычно роли CONNECT (соединение) и RESOURCE (ресурс) предостав ляются тем пользователям базы данных, которые будут создавать объекты, а тем пользователям, которые будут обращаться к объектам с запросами, дается только роль CONNECT. Этим пользователям потребуются допол нительные привилегии на к которым они будут Управление транзакциями Транзакция (transaction) — это группа SQL-операторов, которые выполня ются (успешно или неуспешно) как единое целое. Транзакции являются стандартным элементом реляционных баз данных, обеспечивающим со гласованность информации. Классический пример транзакции — банков ская операция. Рассмотрим два SQL-оператора, с помощью которых осуществляется перевод некоторой суммы, определяемой числом transac с одного банковского счета (f rom_acct) на другой (to_acct).

UPDATE accounts SET balance = balance - transaction_amount WHERE account_no = UPDATE accounts SET balance = balance + WHERE = to_acct;

Предположим, что первый оператор UPDATE выполнен успешно, од нако второй не был выполнен в результате ошибки (например, из-за вы хода из строя базы данных или сети). Тогда данные оказываются несогласованными — деньги сняты со счета но не переведены SQL в PL/SQL на счет to_acct. He стоит и говорить, что такая ситуация весьма неприят на (особенно если владельцем счета являетесь вы сами). Но ее можно предотвратить, если объединить два оператора в одну транзак цию. При этом оба оператора будут либо выполнены, либо не выполне ны, но это обеспечит согласованность данных.

Транзакция начинается с первого SQL-оператора, поступившего после окончания предшествующей транзакции или после соединения с базой данных. Завершается транзакция оператором COMMIT или ROLLBACK.

COMMIT и ROLLBACK Когда над базой данных выполняется оператор COMMIT (завершить), транзакция заканчивается и:

• Вся работа, проделанная этой транзакцией, сохраняется.

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

• Все блокировки, установленные транзакцией, снимаются.

Синтаксис оператора COMMIT:

COMMIT Необязательное ключевое слово WORK (работа) применяется для по вышения удобочитаемости программ. До тех пор пока транзакция не за вершена, внесенные ею изменения может видеть только тот сеанс, который ее выполняет (рис. 4.2). Вначале сеанс А выдает оператор INSERT. Сеанс В обращается с запросом к таблице rooms, но не видит ин формацию, внесенную сеансом А, так как оператор INSERT не завершен.

Затем сеанс А завершает операцию, и во втором операторе SELECT сеанс В увидит вновь введенные строки.

Сеанс А Сеанс В INSERT INTO rooms building, description) VALUES (99991, 310, 50, Room SELECT FROM rooms COMMIT WHERE building = Время SELECT * FROM rooms WHERE building = Рис. 4.2. Два сеанса 156 ГЛАВА Когда над базой данных выполняется оператор ROLLBACK (откатить), транзакция заканчивается и:

• Вся работа, проделанная этой отменяется, как если бы транзакция и не выполнялась.

• Все блокировки, установленные снимаются.

Синтаксис оператора ROLLBACK:

ROLLBACK [WORK] Как и в операторе COMMIT, ключевое слово WORK необязательно и применяется для удобства чтения программ. Явный оператор ROLLBACK обычно используется в том случае, когда программа обнаруживает ошибку и ее выполнение прекращается. Если сеанс отключается от базы данных без окончания текущей транзакции при помощи оператора COMMIT или ROLLBACK, транзакция автоматически откатывается базой данных.

Внимание автоматически выполняет оператор COMMIT, когда пользователь выходит из программы. Кроме того, средство автозавершения (autocommit) выполняет COMMIT после каждого SQL-оператора. Это не оказывает влияния на SQL-операторы внутри блока PL/SQL, так как SOL*Plus не управляет ходом программы до окончания блока. Если сеанс завершается во время транзакции, то COMMIT выполняется неявно. Если оператор заканчивается ошибкой, может произвести откат.

Точки сохранения Как было показано оператор ROLLBACK отменяет всю транзак цию. Однако с помощью команды SAVEPOINT (точка сохранения) можно отменить лишь часть транзакции. Синтаксис оператора SAVEPOINT:

SAVEPOINT имя;

где имя — это имя точки сохранения. Синтаксис имен точек сохранения подчиняется обычным правилам, установленным для идентификаторов SQL (см. главу 3). Обратите внимание, что точки сохранения не описыва ются в разделе объявлений, так как они являются глобальными для всей транзакции, а она может продолжаться и после окончания блока. После того как точка сохранения создана, можно осуществлять откат програм мы к этой точке следующим образом:

ROLLBACK [WORK] TO SAVEPOINT имя;

При выполнении оператора ROLLBACK TO SAVEPOINT происходит следующее:

SQL в PL/SQL • Вся работа, произведенная после этой точки сохранения, отменяет ся. Однако точка сохранения остается активной. При желании откат можно повторить.

• Все блокировки, установленные SQL-операторами после точки со хранения, снимаются, и освобождаются ресурсы, запрошенные SQL-операторами после этой точки.

• Транзакция не заканчивается, так как SQL-операторы находятся в состоянии ожидания.

Рассмотрим фрагмент блока PL/SQL:

BEGIN INSERT INTO temp_table (char_col) VALUES A;

INSERT INTO temp_table (char_col) VALUES SAVEPOINT INSERT INTO VALUES SAVEPOINT C;

/* Выполняются необходимые операторы */ COMMIT;

END;

Если вместо комментария вставить Г] ROLLBACK TO В;

то третий оператор INSERT и точка сохранения С будут отменены. Одна ко первые два оператора INSERT будут обработаны. Если же вместо ком ментария вставить ROLLBACK TO А;

будут отменены второй и третий операторы INSERT и останется только первый.

Команда SAVEPOINT часто используется перед сложным фрагментом транзакции. Если эта часть транзакции выполняется неуспешно, ее мож но откатить, что позволит продолжить выполнение предшествующей части.

Транзакции и блоки Важно различать транзакции и блоки PL/SQL. Если начинается блок, то это не значит, что начинается транзакция. Аналогично, начало транзак ции не обязательно должно совпадать с началом блока. Предположим, что выполняется несколько операторов в SQL*Plus:

INSERT INTO classes course, description, VALUES ( ' CS', 101, 50, 10, 4, 99998);

BEGIN UPDATE rooms SET = + ROLLBACK WORK;

END;

Сначала выполняется оператор INSERT, а затем анонимный блок PL/SQL. В свою очередь, в блоке выполняются операторы UPDATE и ROLLBACK. Оператор ROLLBACK отменяет результаты работы не толь ко оператора UPDATE, но и предшествующего оператора INSERT, кото рый вместе с блоком является частью одного сеанса и, следовательно, одной транзакции.

Точно так же в одном блоке PL/SQL может содержаться несколько транзакций:

DECLARE NUMBER;

- В цикле от 1 до 500 внесем значения счетчика в таблицу - Через каждые 50 строк будем завершать транзакцию.

FOR IN LOOP INSERT INTO VALUES := + 1;

IF = 50 THEN COMMIT;

:= END IF;

END LOOP;

END;

С помощью этого блока в таблицу будут вводиться числа от 1 до 500, причем транзакции будут завершаться через каждые 50 строк.

Таким образом, за время выполнения одного блока будет произведено транзакций.

Автономные транзакции До существовало способа, с помощью которого можно было бы завершить некоторые операции SQL в транзакции независимо от остальных операций. позволяет делать это посредством авто номных транзакций. Автономной транзакцией называется транзакция, которая начинается в контексте другой транзакции (транзакция-пре док), но не зависит от нее. Автономная транзакция может или откатываться независимо от состояния транзакции-предка.

Прагма Автономную транзакцию можно выполнить только внутри блока PL/SQL.

Блок помечается как автономный с помощью прагмы в разделе объявле ний, например:

- Этот пример содержится в файле CREATE OR REPLACE PROCEDURE Autonomous AS SQL в PL/SQL PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN INSERT INTO VALUES (-10, from COMMIT;

END Autonomous;

Внимание Создание процедур рассматривается в главе 9.

Прагма указывает компилятору на то, что блок должен обра батываться как автономный. Вызовем Autonomous из следующего блока PL/SQL:

••- Этот пример содержится в файле BEGIN - Произведем вставку в таблицу из транзакции-предка INSERT INTO temp_table VALUES (-10, from the parent!

- Вызовем процедуру Autonomous, которая не зависит от - этой транзакции Autonomous;

-- Даже после отката транзакции-предка сделанная в Autonomous вставка -- сохраняется ROLLBACK;

END;

В результате выполнения этого блока в таблице будет со держаться только одна строка. INSERT в блоке-предке отменяется при от кате транзакции-предка, но INSERT в процедуре сохраняется.

Г] ••- Этот пример содержится в файле SOL> SELECT * FROM WHERE = -10;

NUM COL CHAR COL -10 Hello Autonomous!

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

Типы автономных блоков Не все блоки можно пометить как автономные.

Это допустимо только для:

• Анонимных блоков верхнего уровня • Локальных, независимых и модульных подпрограмм • Методов объектных типов Триггеров базы данных 160 В частности, вложенные блоки PL/SQL не могут быть автономными.

Только отдельные подпрограммы в модуле могут помечаться как автоном ные — сам модуль не может быть автономным. Следующий сеанс иллюстрирует некоторые допустимые и недопустимые располо жения прагмы. Отметим, что если прагма указывается в недопустимом месте, будет порождаться ошибка -- Этот пример содержится в файле -- Прагма допустима анонимных блоках верхнего уровня:

SQL> DECLARE 2 PRAGMA 3 BEGIN 4 COMMIT;

5 END;

6 / PL/SQL procedure successfully completed.

SQL> -- Но не допустима во вложенных блоках;

SQL> BEGIN 2 DECLARE 3 PRAGMA AUTONOMOUS_TRANSACTION;

4 BEGIN 5 COMMIT;

6 END;

7 END;

8 / PRAGMA * ERROR at line line 3, column 12:

PRAGMA cannot be declared SQL> -- Допустима как в независимых, так и в локальных SQL> CREATE OR REPLACE PROCEDURE AS 2 AUTONOMOUS_TRANSACTION;

4 PROCEDURE Local IS 5 PRAGMA AUTONOMOUS_TRANSACTION;

6 BEGIN 7 ROLLBACK;

8 END Local;

9 BEGIN 10 Local;

11 COMMIT;

12 END 13 / Procedure created.

SQL> show errors No errors.

SQL> -- Допустима в модульных процедурах:

SQL в PL/SQL CREATE OR REPLACE PACKAGE AS 2 PROCEDURE P;

3 END Auto2;

4 / Package created.

SQL> show errors No SQL> CREATE OR REPLACE PACKAGE BODY Auto2 AS 2 PROCEDURE P IS 3 PRAGMA AUTONOMOUS_TRANSACTION;

4 BEGIN 5 COMMIT;

6 END P;

7 END Auto2;

8 / Package body created.

SQL> show errors No errors.

SQL> -- Но не допустима на уровне SOL> CREATE OR REPLACE PACKAGE Auto3 AS 2 PRAGMA 3 PROCEDURE P;

4 PROCEDURE Q;

6/ Warning: Package created with compilation errors.

SQL> show errors Errors for PACKAGE LINE/COL ERROR 2/10 PRAGMA AUTONOMOUS_TRANSACTION cannot be declared here Внимание Модули рассматриваются в главе 9.

Свойства автономных транзакций Автономная транзакция начинается с первой инструкции SQL в автоном ном блоке и заканчивается оператором COMMIT или ROLLBACK. Любой оператор управления транзакцией может использоваться в автономной транзакции, включая COMMIT, ROLLBACK, SAVEPOINT, ROLLBACK TO SAVEPOINT и SET TRANSACTION.

Точки сохранения являются локальными для текущей транзакции.

Следовательно, нельзя вернуться к точке сохранения в транзакции-пред ке, например:

-- Этот пример содержится в файле SQL> CREATE OR REPLACE PROCEDURE AutoProc AS 2 PRAGMA 162 3 BEGIN 4 ROLLBACK TO SAVEPOINT A;

5 END 6 / Procedure created.

SQL> BEGIN 2 SAVEPOINT A;

3 INSERT INTO (char_col) A 5 - А является допустимой точкой сохранения в транзакции-предке, 6 - но недопустимой для автономной транзакции, 7 - поэтому будет возникать ошибка.

8 AutoProc;

9 END;

/ BEGIN * ERROR at line savepoint never established at line at line Завершение автономных транзакций Автономная транзакция завершается оператором или ROLLBACK.

Она не заканчивается с завершением содержащего ее блока. Если авто номный блок заканчивается без окончания транзакции, то возникает ошибка и автономная транзакция откатывается.

Г] Этот пример содержится в файле SQL> DECLARE 2 PRAGMA AUTONOMOUS_TRANSACTION;

3 BEGIN 4 INSERT INTO temp_table VALUES (1);

5 END;

6 / DECLARE * ERROR at line active autonomous transaction detected and rolled back ORA-06512: at line Итоги В этой главе рассматривались язык SQL в целом, а также операторы DML и операторы управления транзакциями, допустимые, в частности, в PL/SQL. Кроме того, говорилось о привилегиях, о ролях и о том, как транзакции обеспечивают согласованность данных. В следующей главе обсуждаются встроенные функции SQL, а в главе 6 — курсоры, применяе мые в многострочных запросах.

s | 164 команды SQL, рассмотренные в главе 4, дополняются множе ством встроенных функций. В этой главе обсуждаются различные виды функций и способы их применения.

Введение В SQL имеется ряд встроенных функций, которые могут быть вызваны из SQL- оператора. К примеру, ниже приведен оператор SELECT, в котором функция UPPER (верхний регистр) используется для получения имен сту дентов, представленных прописными буквами, а не в том в каком они хранятся:

SELECT FROM students;

Многие SQL-функции могут быть вызваны и из процедурных ров PL/SQL. Например, в следующем блоке функция UPPER использует ся в операторе присваивания:

DECLARE BEGIN := END;

можно разделить на категории в соответствии с типом ис пользуемых аргументов. Например, для функции UPPER предполагается применение символьного аргумента. Если задать некорректный то до вызова функции он будет автоматически преобразован PL/SQL в со ответствии с правилами преобразования типов данных (см. главу 3). Кро ме того, по числу обрабатываемых строк можно разделить на групповые и однострочные. Групповые функции обрабатывают несколько строк данных и возвращают один результат. Их разрешается применять только в списках выбора и в конструкциях HAVING запросов. В процедур ных функциях PL/SQL их использование запрещено. Примером группо вой функции является функция COUNT (число строк). Однострочные например UPPER, обрабатывают одно значение и возвращают другое. Их можно использовать в SQL-операторах, где разрешается при менять выражения, а также в процедурных операторах PL/SQL.

Встроенные функции подробно рассматриваются ниже. В каждом раз деле функции приводятся в порядке английского алфавита. Некоторые функции имеют необязательные аргументы. Они указываются в квадрат ных скобках в описании синтаксиса функции.

Встроенные функции SQL Внимание В последующих разделах упоминаются версии и Во всех случаях функция доступна в последней поддерживаемой реализации основной версии (т.е. для и Функция может также быть доступна в более ранних реализациях.

Символьные возвращающие символьные значения Эти функции в качестве аргументов принимают символы (кроме функ ций CHR и NCHR) и возвращают символьные значения. Большинство из них возвращают значения, имеющие тип функции, возвра щающие другие значения, помечены специально. Тип данных, возвраща емых символьными функциями, имеет те же ограничения, что и основной тип базы данных, т.е. значения типа ограничены 4000 символов (2000 в а значения типа CHAR — 2000 символов (255 в При использовании в процедурных операторах эти значе ния можно присваивать переменным PL/SQL, имеющим тип либо VARCHAR2, либо CHAR.

Функция Доступна в версии Где применима CHR(x[USING (USING Процедурные и SQL-операторы.

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

Возвращает символ, который имеет значение, эквивалентное х в наборе символов базы данных.

CHR и ASCII являются противоположными функциями. CHR возвращает символ для заданного номера символа, a ASCII возвращает номер заданного символа. Если указано USING NCHAR_CS и выше), то в качестве набора символов используется национальный набор символов базы данных. Функция NCHAR и выше) эквивалентна CHR с Процедурные и SQL-операторы.

Возвращает строку в соединении со строкой Эта функция идентична оператору Возвращаемое значение всегда имеет тип в наборе символов Процедурные и SQL-операторы.

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

Возвращает строку, где все символы Символы, не являющиеся буквами, не изменяются. Если имеет тип данных CHAR, результат также будет CHAR. Если string — VARCHAR2, то результат будет VARCHAR2.

x[, Процедурные и SQL-операторы.

ГЛАВА Функция Доступна в версии Где применима Возвращает строку 7, дополненную слева до длины х символами из строки Если содержит меньше х символов, она дублируется. Если содержит больше х символов, используются только первые х символов Если строка не указана, то по умолчанию применяется одиночный пробел. Отметим, что х определяется в терминах отображаемой, а не реальной длины. Если набор символов базы данных является многобайтовым, то отображаемая длина может быть больше реальной длины строки в байтах.

LDAP ведет себя аналогично RDAP за исключением того, что дополняет слева, а не справа.

Процедурные и SQL-операторы.

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

Процедурные и SQL-операторы.

[, Возвращает строку, где каждое вхождение символа заменено символом replace_str.

Если не указан, то все экземпляры удаляются. REPLACE реализует подмножество функциональности, предоставляемой функцией TRANSLATE.

x[, Процедурные и SQL-операторы.

Pages:     | 1 || 3 | 4 |   ...   | 7 |



© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.