Разработка простого блока PL/SQL Структура блока PL/SQL DECLARE - необязательно ◦ Переменные, константы, курсоры, пользовательские исключения BEGIN - обязательно ◦ Команды SQL ◦ Управляющие команды PL/SQL EXCEPTION - необязательно ◦ Действия в случае возникновения ошибок END; - обязательно Переменные в PL/SQL Переменные объявляются и инициализируются в декларативной секции. Новые значения переменных присваиваются в секции исполняемого кода. Значения передаются в блоки PL/SQL посредством параметров. Просмотр результатов осуществляется с помощью выходных переменных. Объявление переменных и констант: синтаксис идентификатор[CONSTANT] тип_данных [NOT NULL] [:= | DEFAULT выражение]; Указания Используйте систему присвоения имен. Инициализируйте переменные и константы, объявленные как NOT NULL. Инициализируйте идентификаторы с помощью оператора присваивания (:=) или зарезервированного слова DEFAULT. Объявляйте не более одного идентификатора на строку. Объявление скалярных переменных Не имеют внутренних компонент. Хранят единственное значение. Основные типы: ◦ BINARY_INTEGER ◦ NUMBER[(точность, масштаб)] ◦ СНАR[(максимальная_длина)] ◦ LONG ◦ LONG RAW ◦ VARCHAR2(максимальная_длина) ◦ DATE ◦ BOOLEAN Объявление скалярных переменных: примеры v_gender v_count v_total_sal v_order_date c_tax_rate v_valid CHAR(1); BINARY_INTEGER := 0; NUMBER(9,2) := 0; DATE := SYSDATE + 7; CONSTANT NUMBER(3,2) := 8.25; BOOLEAN NOT NULL := TRUE; Атрибут %TYPE Используется для объявления переменной: ◦ на основе другой ранее заданной переменной. ◦ на основе определения столбца базы данных. Перед атрибутом %TYPE указываются: ◦ таблица и столбец базы данных. ◦ имя ранее заданной переменной. PL/SQL определяет тип и размер переменной. Атрибут %TYPE: примеры DECLARE v_last_name s_emp.last_name%TYPE ; v_first_name s_emp.first_name%TYPE; v_balance NUMBER(7,2); v_minimum_balance v_balance%TYPE := 10; Преимущества использования атрибута %TYPE: Тип данных базового столбца базы данных может быть неизвестен. Тип данных базового столбца базы данных может меняться во время выполнения. Составные типы данных Составные типы данных: ◦ Таблицы PL/SQL ◦ Записи PL/SQL ◦ Содержат внутренние компоненты ◦ Пригодны для повторного использования Таблицы PL/SQL: ◦ Состоят из двух компонент: ◦ Первичный ключ типа BINARY_INTEGER ◦ Столбец данных скалярного типа ◦ Увеличиваются динамически в силу отсутствия ограничений. Структура таблицы PL/SQL Первичный ключ Столбец … … 1 2 3 Jones Smith Maduro ... BINARY_INTEGER … Скалярный тип Объявление таблицы PL/SQL Синтаксис TYPE [NOT type_name IS TABLE OF scalar_datatype NULL] INDEX BY BINARY_INTEGER; Identifier type_name; Пример ... TYPE name_table_type IS TABLE OF VARCHAR2 (25) INDEX BY BINARY_INTEGER; first_name_table name_table_type; last_name_table name_table_type; ... Методы таблиц EXISTS(n) COUNT FIRST LAST PRIOR(n) NEXT(n) EXTEND TRIM DELETE Записи PL/SQL Должны содержать одну или несколько компонент (полей) скалярного типа, типа RECORD или типа TABLE PL/SQL. По структуре сходны с записями в языках третьего поколения. Не эквивалентны строкам таблицы базы данных. Совокупность полей рассматривается как логическая единица. Удобны для выборки строки данных из таблицы для обработки. Структура записи PL/SQL Поле1 (тип данных) Поле2 (тип данных) Поле3 (тип данных) Объявление записи PL/SQL Синтаксис DECLARE TYPE имя_типа IS RECORD (имя_поля1 тип_поля [NOT NULL] [{:=|DEFAULT} expr], имя_поля2 тип_поля [NOT NULL] [{: = |DEFAULT} expr],...); идентификатор имя_типа; Пример DECLARE TYPE emp_record_type IS RECORD (first_name VARCHAR2(25), last_name VARCHAR2(25), gender CHAR(l)); employee_record emp_record_type; Атрибут %ROWTYPE Используется для объявления переменной на основе совокупности столбцов в таблице или представлении базы данных. Перед %ROWTYPE указывается имя таблицы. Поля записи наследуют имена и типы данных от столбцов таблицы или представления. Атрибут %ROWTYPE: преимущества Количество базовых столбцов и типы данных в них могут быть неизвестны. Количество и типы данных базовых столбцов могут меняться во время выполнения. Полезен при выборке строки с помощью команды SELECT. Пример: ... dept_record s_dept%ROWTYPE; emp_record s_emp%ROWTYPE; ... Синтаксические правила для блока PL/SQL Команды могут занимать несколько строк. Лексические единицы можно разделять пробелами. Идентификаторы: ◦ Могут содержать до 30 символов. ◦ Не могут содержать зарезервированные слова (за исключением случая, когда они заключены в двойные кавычки). ◦ Должны начинаться с алфавитного символа. ◦ Не должны совпадать с именами столбцов таблицы базы данных. Синтаксические правила для блока PL/SQL Символьные литералы и литералы типа "дата" должны быть заключены в апострофы. Для чисел допускается как простая, так и научная форма записи. Комментарии могут занимать: ◦ несколько строк между /* и */. ◦ одну строку после --. Вложенные блоки и область видимости переменных Предложения могут быть вложенными везде, где допустима исполняемая команда. Вложенный блок становится командой. Секция исключений также может содержать вложенные блоки. Область видимости объекта - это часть программы, где можно ссылаться на объект. Идентификатор виден в тех областях, в которых на него можно сослаться без квалификатора. ◦ Блок может ссылаться на идентификаторы во внешнем блоке. ◦ Блок не может ссылаться на идентификаторы во вложенном в него блоке. Вложенные блоки и область видимости переменных: пример ... x binary_integer; Область видимости Х BEGIN ... DECLARE y NUMBER; BEGIN ... END; ... END; Область видимости У Присвоение значений переменным: синтаксис identifier := expr; plsql_table_name (primary_key_value) := ехрr; plsql_record_name.field_name := ехрr; Присвоение значений переменным: примеры Приравнивание максимальной заработной платы к текущей. v_max_sal := v_sal; Запись фамилии "Maduro" в таблицу PL/SQL с индексом 3 last_name_table (3) := 'Maduro’; Сохранение основной информации о новом служащем в записи PL/SQL. emp_record.last_name := 'Maduro'; emp_record.first_name := 'Elena’; emp_record.gender := 'F'; Присвоение значений переменным: упражнение DECLARE v_weight NUMBER (3) := 600; v_message VARCHAR2(255) := 'Product 10012’; BEGIN Sub-Block DECLARE v_weight NUMBER(3) := 1; v_message VARCHAR2(255) := 'Product 11001'; v_new_loc VARCHAR2(50) := 'Europe'; BEGIN v_weight := v_weight + 1; v_new_loc := 'Western' || v_new_loc; END; v_weight := v_weight + 1; v_message := v_message || 'is_in_stock'; v_new_loc := ‘Western’ || v_new_loc; END; Операторы в PL/SQL Логические Арифметические Как в SQL Оператор конкатенации Оператор возведения в степень (**) Скобки, определяющие порядок действий } Как в SQL Операторы в PL/SQL: примеры Увеличение счетчика циклов. v_count := v_count + 1; Установка значения логического флага. v_equal := (v_n1 = v_n2); Проверка наличия номера служащего. v_valid := (v_emp_id IS NOT NULL); Функции в PL/SQL Доступные ◦ Числовые (однострочные) ◦ Символьные (однострочные) как в SQL ◦ Для преобразования типов данных ◦ Для работы с датами Недоступные (функции с произвольным количеством параметров) ◦ GREATEST ◦ LEAST ◦ Групповые функции ◦ DECODE Функции в PL/SQL: примеры Создание списка рассылочных адресов для организации. v_mailing_address := v_name||CHR(10)|| v_address||CHR(10)||v_country||CHR(10)|| v_zip_code; Перевод фамилии в символы верхнего регистра. v_last_name := UPPER(v_last_name); Преобразования типов данных Данные преобразуются в совместимые типы. Смешение типов данных может привести к ошибке и/или отразиться на производительности. Функции преобразования: ◦ TO_CHAR ◦ TO_DATE ◦ ТО_NUMBER Преобразования типов данных: пример Некорректное преобразование типов: v_comment := USER||': '||SYSDATE; Для корректного преобразования используется функция TO_CHAR: v_comment := USER||': ' ||ТО_CHAR(SYSDATE); Ссылки на переменные, не являющиеся переменными PL/SQL На переменные, не являющиеся переменными PL/SQL, можно ссылаться как на хост-переменные. Ссылке должно предшествовать двоеточие (:). Запись заработной платы за год в глобальную переменную Procedure Builder: :g_annual_salary := v_salary * 12; Рекомендации по программированию Стремитесь к простоте сопровождения кода. Пишите комментарии к коду. Согласуйте использование строчных и прописных букв. Выработайте систему присвоения имен идентификаторам и прочим объектам. Используйте отступы для упрощения чтения кода. Комментарии к коду Комментарий может находиться: после двух дефисов (--) между /* и */. Пример ... v_sal NUMBER (9,2); BEGIN /* compute the annual salary based on the monthly salary input from the user */ v_sal := v_sal * 12; END; Система обозначений Соглашения Команды SQL Ключевые слова PL/SQL Типы данных Идентификаторы и параметры Таблицы базы данных и столбцы Примеры и регистр символов SELECT, INSERT DECLARE, BEGIN, IF VARCHAR2, BOOLEAN v_sal, emp_cursor, g_sal s_emp, order_date, id Система присвоения имен Идентификатор Переменная Константа Курсор Исключение Тип TABLE TABLE Тип RECORD RECORD Соглашение v_name c_name name_cursor e_name name_table_type name_table name_record_type name_record Пример v_sal c_company_name emp_cursor e_too_many amount_table_type order_total_table emp_record_type customer_record Использование отступов в коде Для наглядности выделяйте каждый уровень кода отступом. Пример ... BEGIN IF x=0 THEN Y=l; END ... END; IF; Заключение Блоки PL/SQL состоят из следующих секций: ◦ Декларативная секция (необязательна) ◦ Секция исполняемого кода (обязательна) ◦ Секция обработки исключений (необязательна) Идентификаторы PL/SQL: ◦ Определяются в декларативной секции. ◦ Могут иметь скалярный или составной тип данных. ◦ Могут быть основаны на структуре другой переменной или объекта базы данных. ◦ Могут инициализироваться.