Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Управление данными. Использование технологий ORACLE для реализации баз данных. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
15.08.2026
Размер:
722 Кб
Скачать

влечь строки из двух таблиц. Извлекаться будут только те строки, у которых значения столбцов отвечают условию в предложении WHERE. Если предложения WHERE нет, то будут извлечены все строки. К примеру, соединив без WHERE 2 таблицы по 1000 строк каждая, мы получим выборку 1 000 000 строк – вряд ли это то, что нам нужно.

3.4. ОБРАБОТКА ОШИБОК

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

Особые состояния можно описывать в секции DECLARE, а затем проверять их наличие в теле блока.

Если особая ситуация существует, то можно выполнить оператор RAISE, который остановит нормальное выполнение блока и передаст управление обработчику особых ситуаций, описанному в секции EXCEPTION данного блока.

ФУНКЦИИ ДИАГНОСТИРОВАНИЯ ОШИБОК

SQLCODE

Возвращает код внутреннего состояния, вызвавшего передачу управления обработчику особых состояний. Если состояние, вызвавшее обработчик, не является внутренним для ORACLE, а описано пользователем в текущем (или объёмлющем) блоке, то SQLCODE возвращает +1. Вне обработчика SQLCODE возвращает 0. Функция SQLCODE позволяет распознавать особые ситуации в обработчике состояний OTHERS.

SQLERRM (код_ошибки)

Возвращает сообщение, соответствующее заданному коду ошибки. Чтобы получить сообщение, соответствующее текущему коду ошибки в SQLCODE, нужно опустить код ошибки. Вне обработчика особых ситуаций SQLERRM вы-

даёт сообщение «normal, successful completion»

Чтобы использовать SQLCODE или SQLERRM в операторе SQL, нужно присвоить их значение переменной, например:

sql_code_num := SQLCODE

37

3.5. ВЫРАЖЕНИЯ

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

Выражения можно использовать:

в списке оператора SELECT;

в условиях после предложений WHERE и HAVING;

в предложениях CONNECT BY, STARTWITH и ORDER BY;

в предложении VALUE оператора INSERT;

в предложении SET оператора UPDATE.

ПОРЯДОК ВЫЧИСЛЕНИЯ (старшинство операций)

1: элементы, заключённые в скобки;

2: возведение в степень;

3: одноместные операторы;

4: умножение и деление

5: сложение, вычитание и конкатенация.

КОНТРОЛЬНЫЕ ВОПРОСЫ К ГЛАВЕ 3

1.Какими командами SQL создаются объекты ORACLE?

2.Какими командами SQL удаляются объекты ORACLE?

3.Какими командами SQL модифицируются объекты ORACLE?

4.Какой командой можно добавить/удалить столбец ORACLE?

5.Какой командой можно добавить/удалить строку?

6.Какими командами SQL выбираются данные из таблиц ORACLE?

7.Какими командами SQL выполняется откат к предыдущему состоянию базы данных?

8.Какими командами SQL выполняется закрытие транзакции?

9.Какими командами SQL выполняется запись изменений в базу дан-

ных?

10.В чём разница между подстановочными символами & и &&?

11.Увеличьте оклад каждого сотрудника в отделе 10 на 10%.

12.Написать и отладить (один) командный файл Peoplel для созданной ранее таблицы People, в котором:

38

выводится таблица вида:

 

ФамилияПринят

Оклад

---------------------

--------

с консоли по запросу задаётся сортировка по фамилии;

с консоли по запросу задаётся сортировка по окладу:

то же самое, но с консоли без запроса.

13. Какая из команд LIKE возвратит строки с именем LAMER:

WHERE last_name LIKE 'L%';

WHERE last_name LIKE '_L%';

WHERE last_name LIKE 'L_M%';

WHERE last_name LIKE '%MER_';

WHERE last_name LIKE '%AM%'.

14. Какие операторы UPDATE допустимы:

UPDATE people SET salary=salary*1.05;

UPDATE people WHERE salary=20000;

UPDATE people SET last_name=1234 WHERE dept=20;

UPDATE people WHERE dept=20 SET last_name=’ИВАНОВ’. 15. Выберите строки, в которых dept = 20.

16. Выберите строки, в которых dept не равно 20. 17. Выберите строки, задавая last_name.

18. Выберите строки с окладом >10 000 и <20 000.

39

4. ЯЗЫК PL/SQL

Язык SQL – непроцедурный. Для реального программирования корпорация Oracle разработала процедурное расширение языка SQL, которое называется PL/SQL. PL/SQL является процедурным, объектно-ориентированным языком, позволяющим создавать новые типы, классы и объекты.

4.1. ТИПЫ ДАННЫХ PL/SQL

Существуют следующие типы данных в PL/SQL:

скалярный (простой) тип;

составной тип – запись;

ссылочный – указатель на объект программы;

LOB (LOCATORS) – большие объекты (BLOB, CLOB, NCLOB,

BFILE).

СКАЛЯРНЫЕ (ПРОСТЫЕ) ТИПЫ СТРОКОВЫЕ ТИПЫ

Тип CHARACTER – используется для хранения строк фиксированной длины.

Синтаксис: { CHARACTER[(длина)] | CHAR[(длина)] }

Максимальное значение параметра длина 255 символов.

Типы VARCHAR и VARCHAR2 используется для хранения строк переменной длины. Следующие предложения эквивалентны:

Синтаксис:

{ VARCHAR[(длина)] | CHAR VARYING[(длина)] | CHARAC-

TER VARYING[(длина)] }

Если длина строки не указана явно, она полагается равной единице во всех случаях. Максимальное значение параметра длина 2000 символов для всех трёх случаев.

VARCHAR2[(длина)]

С помощью этого типа резервируется необходимое пространство для хранения строк максимальной длины 32 767 байт.

Замечание. Максимальная ширина столбца базы данных типа

VARCHAR2 равна 2000 байт.

40

Пример 4.1.

DECLARE str1 CHAR(15);

Str2

CHARACTER

;

VarStrl

VARCHAR(15);

VarStr3

VARCHAR2(512);

Тип LONG. Для хранения больших строк переменной длины используется тип LONG [(длина)]. Если параметр длина не указан, то предполагается, что у строки длина 2 Mb, максимальная длина – 2 Gb. Тип LONG оставлен для совместимости с предыдущими версиями ORACLE. Вместо него рекомендуется использовать типы CLOB и NCLOB/

ЧИСЛОВЫЕ ТИПЫ

Тип INTEGER используется для представления чисел от -231-1 до 231-1

Синтаксис: { INTEGER | INT }

Пример 4.2.

DECLARE

v1 INTEGER;

v2 INT;

Тип NUMBER – используется для представления чисел с заданной точностью.

Синтаксис: NUMBER[ (точность [.масштаб] ) ].

Если значение параметра точность не указано явно, оно полагается равным 38. Значение параметра масштаб по умолчанию предполагается равным 0. Значение параметра точность может изменяться от 1 до 38; значение параметра масштаб может изменяться от –84 до 128. Использование отрицательных значений масштаба означает сдвиг десятичной точки в сторону старших разрядов. Например, определение NUMBER(7, –3) означает округление до тысяч.

Типы DECIMAL и NUMERIC – эквивалентны типу NUMBER Синтаксис: { DECIMAL[(точность[,масштаб])] | DEC [(точность

[,масштаб]) | NUMERIC[(точность[,масштаб])] }

Тип PLS_INTEGER – поддерживается версией PL/SQL Release 2.3 и выше. Позволяет хранить целые числа в диапазоне от – (2 32 – 1) до +(232 – 1) в «родном» целочисленном формате аппаратной платформы. При вычислениях используется встроенная машинная арифметика. Поэтому вычисления выпол-

41

няются быстрее, чем с типами BINARY_INTEGER, NUMBER и т.п. Тип PLS_INTEGER рекомендуется использовать везде, где это возможно – особенно в счётчиках и индексах.

Тип BINARY_INTEGER – аналогичен PLS_INTEGER, однако использует независимые от платформы библиотечные функции Oracle. Работает быстрее, чем NUMBER (и т.п.), но медленнее, чем PLS_INTEGER.

Пример 4.3.

DECLARE

Vcounter NUMBER;

Vardecl DEC;

Vardec2 DEC(7);

Vardec3 DECIMAL(7,3);

Varnum NUMERIC;

БИТОВЫЕ СТРОКИ

Тип RAW – используется для хранения битовых строк переменной длины. Отличие типа RAW от типов CHAR, VARCHAR2 состоит в том, что для типов символьных строк ORACLE производит автоматическое преобразование данных при их передаче между клиентом и сервером.

Синтаксис: RAW[(длина)]

Параметр длина измеряется в байтах. Максимальное значение – 255 байт.

Тип LONG RAW – используется для хранения больших битовых строк переменной длины.

Синтаксис: LONG RAW [(длина)]

Параметр длина измеряется в байтах. Если длина строки не указана явно, она полагается равной 2 Mb. Максимальное значение параметра длина – 2 Gb символов. Для переменных типа LONG RAW невозможно построение индекса.

Пример 4.4.

DECLARE

Bit I raw(15);

Verylongl LONG RAW(100000);

Тип LONG RAW оставлен для совместимости с предыдущими версиями ORACLE. Вместо него рекомендуется использовать тип BLOB.

42

ТИПЫ ДАТА И ВРЕМЯ

Тип DATE используется для хранения даты и времени. Поддерживаются даты с 01.01. 4712 до н. э. до 31.12.4712 н. э. Для присваивания даты обычно используется функция ТО_РАТЕ( 'символьная_строка_даты', 'формат_даты' ).

Синтаксис: DATE

Пример 4.5.

birthday DATE

При определении даты без уточнения времени по умолчанию принимается время полуночи. Функция SYSDATE присваивает переменной текущее значение даты и времени.

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

Пример 4.6.

SQL>select sysdate from dual;

SYSDATE

15-NOV-2020

SQL>select sysdate+20 «sysd+20» from dual; sysd+20 05-DEC-2020

SQL>select sysdate-20 «sysd-20» from dual; sysd-20 26-OCT-2020

МЕТОД %TYPE

Предопределённый метод %TYPE позволяет определить тип переменной, совпадающий с типом атрибута некоторой таблицы, например:

V_ENAME EM.ENAME%TYPE;

V MIN BALANCE EM.BALANCE%TYPE := 10

В этом примере объявляется переменная VENAME того же типа, что и поле ENAME в таблице ЕМ, а переменная V_MIN_BALANCE того же типа, что поле BALANCE в таблице ЕМ. Однако для колонок NOT NULL нельзя пользоваться этим методом.

43

СОСТАВНЫЕ ТИПЫ

К составным типам относятся: PL/SQL записи, PL/SQL таблицы, таблица записей.

ЗАПИСИ

Запись – это группа родственных данных, каждое из которых имеет имя и тип. PL/SQL запись содержит скаляр, запись или поле из PL/SQL таблицы.

СИНТАКСИС КОМАНДЫ СОЗДАНИЯ PL/SQL ЗАПИСИ:

TYPE type_name is record ( field_declaration[, field_declaration]...); – Соз-

дание типа type_name, field_declaration есть

field_name {field_type | variable%TYPE | table.column%TYPE | table%ROWTYPE } [[not null] {:=default | expr}] где

f ield_name – имя поля, f ield_type – его тип, expr – начальное значение identifier type_name; – Создание переменной типа type_name

Пример 4.7.

TYPE emp_record_type IS RECORD ( ename varchar2(10), job

varchar2(9),

sal

number(7,2)

);

emp_record

emp_record_type;

МЕТОД %ROWTYPE

Предопределённый метод %ROWTYPE может применяться как ко всей таблице, так и ее отдельным полям (атрибутам). При использовании этого метода с таблицей или представлением объявляется запись той же структуры, что и таблица или представление. При этом поля записи имеют имена и типы полей таблицы или представления.

Пример 4.8.

DECLARE Emp_record emp%ROWTYPE

После такого описания запись EMP_RECORD имеет те же поля, что и запись ЕМР. Использование %ROWTYPE имеет ряд преимуществ:

число и тип колонок базы данных может быть неизвестен;

число типов колонок базы данных может меняться;

этот атрибут полезен, когда колонка определяется с помощью SELECT утверждения.

44

Если метод %ROWTYPE применяется к отдельным полям (атрибутам), происходит объявление переменной того же типа, что и столбец в таблице, например:

dept_record dept%ROWTYPE

Оператором DECLARE можно создать PL/SQL таблицу следующим образом:

TYPE type_name IS TABLE OF

{column_type|variable%TYPE

|table.column%TYPE}[not null]

[INDEX BY binary_integer]; identifier type_name;

Пример 4.9.

TYPE ename_table_type IS TABLE OF emp.ename%type

INDEX BY binary_integer; ename_table ename_table_type;

Пример 4.10.

DECLARE

TYPE ename_table_type IS TABLE OF emp.e name%TYPE INDEX BY binary_integer;

TYPE hiredate_table_type IS TABLE OF date

INDEX BY binary_integer; ename_table ename_table_type; hiredate_table hiredate_table_type;

BEGIN

ename_table(l) := 'Cameron' ; hiredate_table(8):=SYSDATE+7;

END;

Следующие функции облегчают работу с таблицами:

− EXISTS(n) – возвращает TRUE, если n-й элемент в таблице сущест-

вует;

COUNT – возвращает количество элементов в данный момент в

PL/SQL таблице;

FIRST and LAST – возвращает первый и последний (самый маленький или самый большой) индексы в PL/SQL таблице;

PRIOR(n) – возвращает значение индекса, предшествующего индексу n в PL/SQL таблице;

NEXT – возвращает значение индекса, следующего за индексом n в PL/SQL таблице;

45

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]