Выбрать главу

последовательность в SQL, вы можете задать её начальное значение

и приращение для ряда последующих чисел. Чтобы получить текущее

значение последовательности, используется псевдостолбец currval,

чтобы сгенерировать следующее число - nextval. Перед обращением к

currval необходимо использовать nextval для создания первоначального

числа.

Следующее выражение создаёт таблицу new_products; эта таблица вскоре

будет использована:

□ CREATE TABLE new_products (

product_id INTEGER CONSTRAINT new_products_pk PRIMARY KEY,

name VARCHAR2(30) NOT NULL,

p r ic e NUMBER(5, 2)

);

Следующее выражение создаёт последовательность по имени s_

product_id:

□ CREATE SEQUENCE s_product_id;

Следующее выражение создаёт процедуру по имени add_new_products,

которая использует s_product_id для установки столбца product_id в строке,

добавленной к таблице new_products. Обратите внимание на использование

псевдостолбцов currval и nextval в коде PL/SQL (это нововведение

в Oracle l lg ) :

□ CREATE PROCEDURE add_new_products

AS

Знакомство с программированием на PL/SQL 393

v_product_id BINARY_INTEGER;

BEGIN

- используем nextval для генерации первого числа последовательности

v_product_id := s_produc t_id.nextval;

DBMS_OUTPUT.PUT_LINE(' v_product_id = ' || v_product_id);

- добавим строку в new_products

INSERT INTO new_products

VALUES (v_product_id, 'Plasma Phys ic s book', 49.95);

DBMS_OUTPUT.PUT_LINE(' s_ pro d u c t_ id .cu r rv a l = ' || s_product_id.

c u r r v a l ) ;

- используем nextval для генерации следующего числа последовательности

v_product_id := s_produc t_id.nextval;

DBMS_OUTPUT.PUT_LINE(' v_product_id = ' || v_product_id);

- добавим ещё одну строку в new_products

INSERT INTO new_products

VALUES (v_product_id, 'Quantum Phys ic s book', 69.95);

DBMS_OUTPUT.PUT_LINE(' s_ pro d u c t_ id .cu r rv a l = ' || s_product_id.

c u r rv a l) ;

END add_new_products;

/

Следующий пример выполняет add_new_products() и показывает содержимое

таблицы new_products:

□ SET SERVEROUTPUT ON

CALL add_new_products();

v_product_id = 1

s_ pro d u c t_ id .cu r rv a l = 1

v_product_id = 2

s_ pro d u c t_ id .cu r rv a l = 2

SELECT * FROM new_products;

PRODUCT_ID NAME PRICE

1 Plasma Phys ics book 49.95

2 Quantum Phys ics book 69.95

Как и предполагалось, в таблицу были добавлены две строки.

Генерация родного машинного кода для PL/SQL

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

форму, машино-читаемый код. Этот машино-читаемый код

хранится в базе данных и интерпретируется всякий раз, когда его запускают.

С компиляцией PL/SQL в родной код PL/SQL преобразуется в родной

машинный код и сохраняется в разделяемых библиотеках. Родной код выполняется

значительно быстрее промежуточного кода, поскольку не требует

интерпретации перед запуском.

394 Глава 11

В некоторых версиях базы данных, до версии Oracle 1 lg, вы могли компилировать

PL/SQL код в С код, а затем компилировать С код в машинный

код; это довольно сложный и проблематичный процесс. В Oracle l l g

компилятор PL/SQL может напрямую генерировать родной машинный

код. Настройку базы данных на генерацию родного машинного кода должен

выполнять только опытный АБД (эта тема выходит за рамки данной

книги). Вы можете узнать всё о генерации родного машинного кода PL/

SQL в руководстве PL/SQL User's Guide and Reference корпорации Oracle.

Итоги

В этой главе вы узнали, что

■ Программы для PL/SQL делятся на блоки, в каждом из которых содержатся

операторы SQL и PL/SQL.

■ Для многократного выполнения одного или нескольких операторов

можно использовать такие операторы цикла, как FOR или WHILE.

■ Курсор позволяет PL/SQL читать строки, возвращаемые запросом.

■ Исключения используются для обработки ошибок исполнения, происходящих

в коде PL/SQL.

■ Процедура содержит группу операторов SQL и PL/SQL. Процедуры

позволяют централизовать в базе данных бизнес-логику предприятия

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

к базе данных.

■ Функция похожа на процедуру за тем исключением, что функция

должна возвращать некоторое значение.

■ Можно группировать процедуры и функции в пакеты, которые позволяют

инкапсулировать связанные функциональности в один автономный

модуль.

■ Триггером называется процедура, которая автоматически выполняется

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

оператор INSERT, UPDATE или DELETE. Триггеры бывают полезны для

выполнения расширенного аудита изменений, производимых над

значениями столбцов таблицы.

В следующей главе вы ознакомитесь с объектами базы данных.,

Глава 12

Объекты базы

данных

Знакомство с объектами

Такие объектно-ориентированные языки программирования, как Java,