кода триггера.
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.
Напомню, что последовательность генерирует ряд чисел. Когда вы создаёте