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

кода триггера.

STATUS VARCHAR2(8) Указывает, можно ли активировать и блокировать

триггер. Принимает значения e n a b l e d и л и

DISABLED.

DESCRIPTION VARCHAR2(4000) Описание триггера.

ACTION_TYPE VARCHAR2(11) Тип действия триггера. Принимает значения CALL

или PL/SQL.

TRIGGER_BODY LONG Содержащийся в теле триггера код. Тип данных

LONG позволяет хранить большие объемы текста

(см. главу 14).

Примечание Информацию о всех триггерах, к которым разрешен доступ, можно найти в

all_triggers.

В следующем примере из user_triggers отбирается детальная информация

о триггере before_product_price_update (распечатка приведена для ясности):

□ SELECT trigger_name, t г igge r_ type , t rigg e r ing _ e v ent , table_owner

base_object_type, table_name, referencing_names, when_clause, s tatus,

d e s c r ip t io n , ac tion_type, trigger_body

FROM u s e r j t r ig g e r s

WHERE trigger_name = ' BEFORE_PRODUCT_PRICE_UPDATE’ ;

TRIGGER_NAME TRIGGER_TYPE

BEFORE PRODUCT PRICE UPDATE BEFORE EACH ROW

390 Глава 11

TRIGGERING_EVENT

UPDATE

TABLE_OWNER BAS E_0BJ ECT_TYP E TABLE_NAME

STORE TABLE PRODUCTS

REFERENCING_NAMES

REFERENCING NEW AS NEW OLD AS OLD

WHEN_CLAUSE

new.price < o ld .p r i c e * 0.75

STATUS

ENABLED _ -

DESCRIPTION

before_product_price_update

BEFORE UPDATE OF

p r ice

ON

products

FOR EACH ROW

ACTION_TYPE

PL/SQL

TRIGGER_BODY

BEGIN

dbms_output.put_line(' product_id =

dbms_output...

' M :old.produc t_id) ;

Примечание Вы можете посмотреть весь

SQL*Plus, например, SET LONG 1000.

код триггера, используя команду SET LONG

Активация и блокировка триггера

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

оператора ALTER TRIGGER. Следующий оператор блокирует триггер

before_product_price_update:

П ALTER TRIGGER before_product_price_update DISABLE;

Следующий оператор активирует триггер before_product_price_update:

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

П ALTER TRIGGER before_product_price_update ENABLE;

Удаление триггера

Для удаления триггера используется оператор DROP TRIGGER. Следующий

оператор удаляет триггер before_product_price_update:

□ DROP TRIGGER before_product_price_update;

Нововведения PL/SQL в базе данных Oracle 11g

В этом разделе вы увидите некоторые из нововведений для PL/SQL, которые

появились в Oracle 1 lg. Мы рассмотрим следующие из них:

■ Тип SIMPLE_INTEGER,

■ Поддержка последовательностей в PL/SQL,

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

Тип SIMPLEJNTEGER

Тип SIMPLE_INTEGER является подтипом BINARY_INTEGER; тип SIMPLE_INTEGER

может хранить такой же диапазон, как BINARY_INTEGER, за тем исключением,

что SIMPLE_INTEGER не может хранить пустые значения. Диапазон значений,

которые может хранить SIMPLE_INTEGER, составляет от -231

(-2,147,483,648) до 231 (2,147,483,648).

Арифметическое переполнение обрезается при использовании значений

SIMPLE_INTEGER; следовательно, вычисления не будут генерировать

ошибки переполнения. Поскольку ошибки переполнения игнорируются,

значения, хранящиеся в SIMPLE_INTEGER, могут переходить от положительных

к отрицательным и наоборот, например:

□ 230 + 230 = 0x40000000 + 0x40000000 = 0x80000000 = -231

-231 + -231 = 0x 8 0 0 0 0 0 0 0 + 0x8 0 0 0 0 0 00 = 0x0 0 0 0 0 0 00 = 0

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

получается отрицательное число. Во втором примере в результате сложения

двух отрицательных чисел получен ноль.

Из-за того, что переполнение игнорируется и обрезается при использовании

значений SIMPLE_INTEGER в вычислениях, SIMPLE_INTEGER предлагает

гораздо лучшую производительность по сравнению с BINARY_INTEGER, если

АБД сконфигурирует базу данных на компиляцию PL/SQL в родной машинный

код. Поэтому вам следует использовать SIMPLE_INTEGER в вашем

коде PL/SQL, если вам не требуется хранить значения NULL и вас не беспокоит

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

BINARY_INTEGER.

Следующая процедура get_area() показывает использование типа

SIMPLE_INTEGER; get_area() вычисляет и показывает площадь прямоугольника:

□ CREATE PROCEDURE get_area

AS

392 Глава 11

v_width SIMPLE_INTEGER := 10;

v_height SIMPLE_INTEGER := 2;

v_area SIMPLE_INTEGER := v_width * v_height;

BEGIN

DBMS_OUTPUT.PUT_LINE(1v_area = ' || v_area);

END get_area;

/

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

с именем plsql_11g_examples.sql в папке SQL. Вы можете запустить этот сценарий, если

используете базу данных Oracle 11 д.

Следующий пример показывает выполнение get_area():

□ SET SERVEROUTPUT ON

CALL get_area();

v_area = 20

Как и ожидалось, вычисленная площадь равна 20.

Последовательности в PL/SQL

В предыдущей главе вы видели, как создавать и использовать числовые

последовательности в SQL. В базе данных Oracle l l g вы также можете использовать

последовательности в коде PL/SQL.

Напомню, что последовательность генерирует ряд чисел. Когда вы создаёте