EXIT WHEN cursor_variable%NOTFOUND;
...
END LOOP;
CLOSE cursor_variable;
END;
12.触发器
CREATE [OR REPLACE] TRIGGER Trigger_name
{BEFORE|AFTER} Triggering_event ON table_name
[REFERENCING NEW|OLD AS NEW_RECORD|OLD_RECORD]
[FOR EACH ROW]
[FOLLOWS another_trigger]
[ENABLE/DISABLE]
[WHEN condition]
DECLARE
declaration statements
BEGIN
executable statements
EXCEPTION
exception-handling statements
END;
:NEW为引用最新的列值
:OLD为引用以前的列值
以上两个变量只有在使用了FOR EACH ROW的时候才有效,UPDATE可以使用:NEW与:OLD,INSERT只可以使用:NEW,DELETE只可以使用:OLD
----
两类:
行触发器和语句触发器
使用INSTEAD OF 触发器:定义与数据库视图的
eg:
CREATE OR REPLACE TRIGGER instrustructor_sum_del
INSTEAD OF DELETE ON instructor_sum_view
FOR EACH ROW
BEGIN
DELETE FROM instructor WHERE instructor_id= :OLD.instructor_id;
END;
13.复合触发器
eg:
CREATE OR REPLACE TRIGGER student_compound
FOR INSERT ON STUDENT
COMPOUND TRIGGER
v_day VARCHAR2(12);
BEFORE STATEMENT IS
BEGIN
...
--语句级触发器,不能用:OLD与:NEW
BEFORE EACH ROW IS
BEGIN
... --行触发器,能够使用:OLD与:NEW
END BEFORE EACH ROW;
END student_compound;
14.集合
a.联合数组
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY element_type;
table_name TYPE_NAME;
eg:
DECLARE
TYPE last_name_type IS TABLE OF student.last_name%TYPE INDEX BY BINARY_INTERGE;
last_name_tab last_name_type;
b.嵌套数组
TYPE type_name IS TABLE OF element_type [NOT NULL];
table_name TYPE_NAME;
注:必须先初始化嵌套表
eg:
DECLARE
TYPE last_name_type IS TABLE OF student.last_name%TYPE;
last_name_tab last_name_type := last_name_type(); --初始化嵌套表
c.集合的方法
如果某特定元素存在于集合中,则EXISTS会返回TRUE。该方法可用于避免SUBSCRIPT_OUTSIDE_LIMIT异常
COUNT返回集合中元素的数量
EXTEND会扩展集合的规模
DELETE会删除集合中所有元素,指定范围的元素,或者特定元素。注意,PL/SQL会保存删除元素的占位符
FIRST 和 LAST 会返回集合中第一个和最后一个元素的下标。注意,如果嵌套表的第一个元素被删除,则FIRST方法会返回大于1的值。如果嵌套表删除
一个中间元素,则LAST方法的返回值会大于COUNT方法的返回值
PRIOR和NEXT会返回指定集合下标的前序和后续下标。
TRIM会从集合的末尾删除一个,或者指定数量的元素。注意,PL/SQL不会保存被删除元素的占位符。
eg:
DECLARE
TYPE index_by_type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
index_by_table index_by_type;
TYPE nested_type IS TABLE OF NUMBER;
nested_table nested_type := nested_type(1,2,3,4,5,6,7,8,9,10);
BEGIN
FOR i IN 1..10 LOOP
index_by_table(i) := i;
END LOOP;
IF index_by_table.EXISTS(3) THEN
DBMS_OUTPUT.PUT_LINE ('......');
END IF;