第八章 游標和觸發器
初識游標
在PL/SQL塊中執行SELECT、INSERT、DELETE和UPDATE陳述句時,ORACLE會在記憶體中為其分配背景關系區(Context Area),即緩沖區,游標是指向該區的一個指標,或是命名一個作業區(Work Area),或是一種結構化資料型別,它為應用等量齊觀提供了一種對具有多行資料查詢結果集中的每一行資料分別進行單獨處理的方法,是設計嵌入式SQL陳述句的應用程式的常用編程方式,
定位行,逐行跳動
游標分類
1. 顯式 游標用于處理SELECT陳述句回傳的多行資料;人為創建,干預
2. 隱式 游標用于處理SELECT INTO和非查詢的DML陳述句;系統自動創建,管理
常用屬性 CURSOR
%ISOPEN
用于確定游標是否已經打開,如果游標已經打開,則回傳值為TRUE;否則回傳FALSE
%FOUND
檢查是否從結果集中提取到資料,如果提取到資料,則回傳值為TRUE;否則回傳FALSE
%NOTFOUND
與%FOUND屬性恰好相反,如果提取到資料,則回傳值為FALSE;否則回傳TRUE
%ROWCOUNT
回傳到當前行為止已經提取到的實際行數
顯示游標格式:
1. 定義游標
CURSOR cursor_name IS select_SQL;
2. 打開游標
OPEN cursor_name;
3. 提取資料
FETCH cursor_name INTO variable1,variable2,...;
當運行fetch后,游標才開始作業,記錄當前行,有資料則下移,然后置%FOUND,%NOTFOUND的值
4. 關閉游標
CLOSE cursor_name;
顯示游標:

游標動態傳參,顯示游標

隱式for回圈游標:

隱含游標,當執行一條非查詢的DML陳述句或者SELECT...INTO陳述句時,都會創建一個隱含游標
1. 隱含游標的名稱是SQL,不能對SQL游標顯式執行OPEN、FETCH和CLOSE陳述句,
2. Oracle隱式地打開、提取,并總是自動地關閉SQL游標
3. 隱含游標的屬性
SQL%FOUND
SQL%NOTFOUND
SQL%ROWCOUNT
SQL%ISOPEN
示例
declare
v_stuId number := '&input_stuId';
begin
delete from student where stu_id=v_stuId;
if sql%found then
DBMS_OUTPUT.PUT_LINE('找到員工');
else
DBMS_OUTPUT.PUT_LINE('未找到員工');
end if;
end;
初始觸發器
觸發器是指被隱含執行的存盤程序,它可以使用PL/SQL進行開發
當發生特定事件(如修改表、創建物件、登錄到資料庫)時,Oracle會自動執行觸發器的相應代碼
觸發器的型別
1、DML觸發器
在對資料庫表進行DML(insert,update,delete)操作時觸發,并且可以對每行或者陳述句操作上進行觸發,
2、替代觸發器
是oracle8專門為進行視圖操作的一種觸發器
3、系統觸發器
對資料庫系統事件進行觸發,如啟動、關閉等
注意事項:
1. 觸發器不接受引數,
2. 一個表上最多可有12個觸發器,但同一時間、同一事件、同一型別的觸發器只能有一個,并各觸發器之間不能有矛盾,
3. 在一個表上的觸發器越多,對在該表上的DML操作的性能影響就越大,
4. 觸發器最大為32KB,若確實需要,可以先建立程序,然后在觸發器中用CALL陳述句進行呼叫,
5. 觸發器中不能包含事務控制陳述句(COMMIT,ROLLBACK,SAVEPOINT),因為觸發器是觸發陳述句的一部分,觸發陳述句被提交、回退時,觸發器也被提交、回退了,在觸發器主體中呼叫的任何程序、函式,都不能使用事務控制陳述句,
表頭復制
CREATE TABLE dept_log AS SELECT * FROM dept WHERE 1=2;
DML觸發器
洗掉示例:
create or replace trigger tr_del_student
--指定觸發時機為洗掉操作前觸發
before delete
on student
--說明創建的是行級觸發器
for each row
begin
--將修改前資料插入到日志記錄表,要確保SQL可以正常作業
insert into student_log values(:old.stu_id,:old.stu_name,:old.stu_age,:old.stu_sex,:old.stu_class,:old.stu_create_date);
end;
修改示例
create or replace trigger tr_update_student
--指定觸發時機為修改操作后觸發
after update
on student
for each row
begin
-- 記錄修改后的值
insert into student_log
values(:new.stu_id,:new.stu_name,:new.stu_age,:new.stu_sex,:new.stu_class,:new.stu_create_date);
end;
洗掉觸發器
drop trigger trigger_name
系統觸發器

創建日志記錄表
create table log_event(
log_type varchar2(20),
username varchar2(20),
logonTime date,
logoffTime date
);
登錄觸發器
create or replace trigger logon_trigger
after logon on database
begin
insert into log_event(log_type,username,logonTime)
values('logon',ora_login_user,sysdate);
end;
登出觸發器
create or replace trigger logoff_trigger
before logoff on database
begin
insert into log_event(log_type,username,logoffTime)
values('logoff',ora_login_user,sysdate);
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/14952.html
標籤:Oracle
上一篇:使用plsql編程
