日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

游标和触发器

發布時間:2024/1/23 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 游标和触发器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

視頻課:https://edu.csdn.net/course/play/7940

本章將學習oracle游標和觸發器。在實際開發過程中,有一些復雜的邏輯必須對表中每一條記錄分別進行單獨處理,此時必須使用游標。游標提供了一種用于實現更加復雜的業務邏輯的途徑。游標是指向上下文的指針。Oracle觸發器是一種特殊的過程,它也有聲明段,可執行段和異常處理段。在表或視圖上創建針對INSERT,UPDATE,DELETE操作的觸發器,只要在表或視圖上發生INSERT,UPDATE,DELETE操作時自動觸發。

?


FETCH…INTO語句每次只能處理一行數據,為了處理結果集中的多行據,必須使用循環語句

進行處理。

?

?

從Oracle 9i開始,通過使用?FETCH…BULK COLLECT INTO語句,可以一次性提取結果集中的所有數據。

6.1?.2參數游標

參數游標是指帶有參數的游標。在定義了參數游標之后,使用不同參數值多次打開游標可以生成不同的結果集。

語法:

Cursor cursor_name(parameter_namedatatype) is ?select_statement

上述語法中,當定義參數游標時,需要指定參數名及其數據類型。

?

6.1?游標

SQL語言是面向集合的,其結果一般是集合量?(多條記錄),而PL/SQL語言的變量一般是標量,一組變量一次只能存放一條記錄。查詢結果的記錄數是不確定的,事先無法確定需要聲明多少個變量,所以僅使用變量并不能完全滿足?SQL語句向應用輸出數據的要求。為此,PL/SQL 中引入了游標?(cursor)的概念,使用游標來協調這兩種不同的處理方式。當在PL/SQL塊中執行查詢語句?(SELECT)和數據操縱語句?(DML)時,0racle會為其分配上下文區?(Context Area)。游標是指向上下文區的指針,它為應用提供了一種對具有多行數據查詢結果集中的每一行數據分別進行單獨處理的方法。

6.1?.1顯式游標

游標分為顯式游標和隱含游標兩種。其中,隱含游標用于處理SELECTINTO和DML語句,而顯式游標則用于處理SELECT語句返回的多行數據。

為了處理SELECT語句返回的多行數據,開發人員可以使用顯式游標。使用顯式游標包括定義游標?(DECLARE)、打開游標?(OPEN)、提取數據?(FETCH)和關閉游標?(CLOSE)4個階段。

(1?)定義游標。

在使用顯式游標之前,必須首先在定義部分定義游標,用于指定游標所對應的?SELECT語句。

語法:

Cursor cursor_nameisselect_statement

上述語法中,cursor_name用于指定游標名稱,select_statement用于指定游標對應的SELECT語句。

(2)打開游標。

當打開游標時,Oracle會執行游標所對應的?SELECT語句,并將?SELECT語句的結果暫時存放在結果集中。

語法:

Open ?cursor_name;

上述語法中,cursor_name必須是在定義部分已經被定義的游標。

(3)提取數據。

在打開游標之后,SELECT語句的結果被臨時存放在游標結果集中。為了處理結果集合中的數據,需要使用FETCH語句提取游標數據。在Oracle 9i之前,使用FETCH語句一次只能提取一行數據。從Oracle 9i開始,通過使用FETCH…BULK COLLECT INTO語句,一次可以提取多行數據。

語法:

Fetch ??cursor_name ?into variable1,variable2,…;

或者

Fetch cursor_name ?bulk ?collect ?into ?collect1,collect2,…;

上述語法中,variablevariable1,variable2,…用于指定接收游標數據的變量,collectcollect1,collect2,…用于指定接收游標結果的集合變量。

(4)關閉游標。

在提取并處理了結果集的所有數據之后,就可以關閉游標并釋放其結果集了。

語法:

Close ?cursor_name;

在實際應用中,我們需要對游標進行判斷操作,顯式游標屬性用于返回顯式游標的執行信息,包括%ISOPEN、%FOUND、%NOTFOUND 以及?% ROWCOUNT等屬性。當使用顯式游標屬性時,必須在顯式游標屬性之前添加顯式游標名作為前綴,其格式為:

游標名. 屬性名

顯示游標的屬性如表3.1.23-1-3所示。

表3.1.23-1-3?顯式游標屬性

屬性名

說明

%isopen

確定游標是否已經打開,如果打開返回true,否則返回false。

%found

用于檢查是否從結果集中提取到數據,如果提取到返回true,否則返回false。

%notfound

如果提取到數據返回false,否則返回true。

%rowcount

用于返回到當前為止已經提取到的實際行數。


注意:

定義參數游標時,游標參數只能指定數據類型而不能指定長度。

6.1?.3游標FOR循環

游標FOR循環是在PL/SQL塊中使用游標的最簡單方式,它可以簡化對游標的處理。當使用游標For循環時,?Oracle會隱含地打開游標,提取游標數據并關閉游標。

語法:

For ?record_name ??in ??cursor_name ?loop

……

End loop;

上述語法中,cursor_name是已經定義的游標名,record_name是Oracle 隱含定義的記錄變量名。當使用游標FOR循環時,在執行循環體內容之前Oracle會隱含地打開游標,并且每循環一次提取一次數據,在提取了所有數據之后自動退出循環并隱含地關閉游標。

6.1?使用游標變量

當使用顯式游標時,需要在定義部分指定其所對應的靜態?SELECT語句;而當使用游標變量時,開發人員可以在打開游標變量時指定其所對應的?SELECT語句。開發人員可以在應用中直接使用PL/SQL游標變量。在PL/SQL塊中使用游標變量包括定義游標變量、打開游標、提取游標數據、關閉游標4個階段,具體步驟如下:

1. 定義REF CURSOR類型和游標變量

為了在PL/SQL塊中定義游標變量,必須首先定義REF CURSOR類型,然后才能定義游標變量。

語法:

Type ?ref_type_name ?is ref ?cursor;

Cursor_variable??ref_type_name;

上述語法中,ref_type_name用于指定自定義類型名,cursor_variable用于指定游標變量名。另外,不能在包內定義游標變量。


隱含游標

隱含游標由?PL/SQL控制。當執行一條DML語句或者?SELECT…INTO語句時,都會創建一個隱含游標。隱含游標的名稱是?SQL,不能對?SQL游標顯式地執行OPEN、FETCH和?CLOSE語句。Oracle 隱式地打開、提取,并總是自動地關閉?SQL 游標。隱含游標屬性包括?SQL%FOUND、SQL%NOTFOUND、SQL%ROWCOUNT、SQL%ISOPEN等。

1. SQL% FOUND

只有DML語句影響一行或多行時,SQL%FOUND屬性才返回true。?


SQL% NOT FOUND

SQL%NOTFOUND屬性的作用與?SQL%FOUND屬性剛好相反。如果?DML語句沒有影響任何行數,則?SQL%NOTFOUND屬性返回?TRUBTRUE,否則返回?FALSE。

3. SQL% ROW COUNT

SQL%ROWCOUNT?屬性會返回?DML語句影響的行數。如果?DML語句沒有影響任何行,則SQL%ROWCOUNT屬性將返回?0。SQL%ROWCOUNT屬性的使用方法可參考圖3.1.20中sql%found的用法。

4. SQL% ISOPEN

SQL%ISOPEN屬性用于判斷SQL游標是否已經打開。在執行?SQL語句之后,Oracle?自動地關閉SQL游標,所以隱含游標的SQL%ISOPEN屬性始終為FALSE。


6.2?觸發器

觸發器是許多關系數據庫系統都提供的一項技術。在ORACLE系統里,觸發器類似過程和函數,都有聲明,執行和異常處理過程的PL/SQL塊。

6.2.1觸發器類型

????觸發器在數據庫里以獨立的對象存儲,它與存儲過程和函數不同的是,存儲過程與函數需要用戶顯示調用才執行,而觸發器是由一個事件來啟動運行。即觸發器是當某個事件發生時自動地隱式運行。并且,觸發器不能接收參數。所以運行觸發器就叫觸發或點火(firing)。ORACLE事件指的是對數據庫的表進行的INSERT、UPDATE及DELETE操作或對視圖進行類似的操作。ORACLE將觸發器的功能擴展到了ORACLE系統事件的發生,如數據庫的啟動與關閉等,也會觸發觸發器。所以觸發器常用來完成由數據庫的完整性約束難以完成的復雜業務規則的約束,或用來監視對數據庫的各種操作,實現審計的功能。

1 DML觸發器

????ORACLE可以在DML語句進行觸發,可以在DML操作前或操作后進行觸發,并且可以對每個行或語句操作上進行觸發。

2 替代觸發器

????由于在ORACLE里,不能直接對由兩個以上的表建立的視圖進行操作。所以給出了替代觸發器。它就是ORACLE 8專門為進行視圖操作的一種處理方法。

3 系統觸發器

ORACLE 11g?提供了第三種類型的觸發器叫系統觸發器。它可以在ORACLE數據庫系統的事件中進行觸發,如ORACLE系統的啟動與關閉等。

?

觸發器組成:

l 觸發事件:引起觸發器被觸發的事件。 例如:DML語句(INSERT, UPDATE, DELETE語句對表或視圖執行數據處理操作)、DDL語句(如CREATE、ALTER、DROP語句在數據庫中創建、修改、刪除模式對象)、數據庫系統事件(如系統啟動或退出、異常錯誤)、用戶事件(如登錄或退出數據庫)。

觸發時間:即該TRIGGER 是在觸發事件發生之前(BEFORE)還是之后(AFTER)觸發,也就是觸發事件和該TRIGGER 的操作順序。

觸發操作:即該TRIGGER 被觸發之后的目的和意圖,正是觸發器本身要做的事情。 例如:PL/SQL 塊。

觸發對象:包括表、視圖、模式、數據庫。只有在這些對象上發生了符合觸發條件的觸發事件,才會執行觸發操作。

觸發條件:由WHEN子句指定一個邏輯表達式。只有當該表達式的值為TRUE時,遇到觸發事件才會自動執行觸發器,使其執行觸發操作。

觸發頻率:說明觸發器內定義的動作被執行的次數。即語句級(STATEMENT)觸發器和行級(ROW)觸發器。

語句級(STATEMENT)觸發器:是指當某觸發事件發生時,該觸發器只執行一次;

行級(ROW)觸發器:是指當某觸發事件發生時,對受到該操作影響的每一行數據,觸發器都單獨執行一次。

編寫觸發器時,需要注意以下幾點:

1. 觸發器不接受參數。

2. 一個表上最多可有12個觸發器,但同一時間、同一事件、同一類型的觸發器只能有一個。并各觸發器之間不能有矛盾。

3.?在一個表上的觸發器越多,對在該表上的DML操作的性能影響就越大。

4.?觸發器最大為32KB。若確實需要,可以先建立過程,然后在觸發器中用CALL語句進行調用。

5. 在觸發器的執行部分只能用DML語句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL語句(CREATE、ALTER、DROP)。

6. 觸發器中不能包含事務控制語句(COMMIT,ROLLBACK,SAVEPOINT)。因為觸發器是觸發語句的一部分,觸發語句被提交、回退時,觸發器也被提交、回退了。在觸發器主體中調用的任何過程、函數,都不能使用事務控制語句。在觸發器主體中不能申明任何Long和blob變量。新值new和舊值old也不能向表中的任何long和blob列。

7. 不同類型的觸發器(如DML觸發器、INSTEAD OF觸發器、系統觸發器)的語法格式和作用有較大區別。
?

6.2.2創建觸發器

創建觸發器的一般語法是:

CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.]table_name | [schema.]view_name
[REFERENCING {OLD [AS] old | NEW [AS] new}]
[FOR EACH ROW ]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name;

?

其中:

BEFORE 和AFTER指出觸發器的觸發時序分別為前觸發和后觸發方式,前觸發是在執行觸發事件之前觸發當前所創建的觸發器,后觸發是在執行觸發事件之后觸發當前所創建的觸發器。

FOR EACH ROW選項說明觸發器為行觸發器。行觸發器和語句觸發器的區別表現在:行觸發器要求當一個DML語句操走影響數據庫中的多行數據時,對于其中的每個數據行,只要它們符合觸發約束條件,均激活一次觸發器;而語句觸發器將整個語句操作作為觸發事件,當它符合約束條件時,激活一次觸發器。當省略FOR EACH ROW 選項時,BEFORE 和AFTER 觸發器為語句觸發器,而INSTEAD OF 觸發器則只能為行觸發器。

REFERENCING 子句說明相關名稱,在行觸發器的PL/SQL塊和WHEN 子句中可以使用相關名稱參照當前的新、舊列值,默認的相關名稱分別為OLD和NEW。觸發器的PL/SQL塊中應用相關名稱時,必須在它們之前加冒號(:),但在WHEN子句中則不能加冒號。

WHEN 子句說明觸發約束條件。Condition 為一個邏輯表達時,其中必須包含相關名稱,而不能包含查詢語句,也不能調用PL/SQL 函數。WHEN 子句指定的觸發約束條件只能用在BEFORE 和AFTER 行觸發器中,不能用在INSTEAD OF 行觸發器和其它類型的觸發器中。

當一個基表被修改( INSERT, UPDATE, DELETE)時要執行的存儲過程,執行時根據其所依附的基表改動而自動觸發,因此與應用程序無關,用數據庫觸發器可以保證數據的一致性和完整性。

?

每張表最多可建立12 種類型的觸發器,它們是:

BEFORE INSERT

BEFORE INSERT FOR EACH ROW

AFTER INSERT

AFTER INSERT FOR EACH ROW

BEFORE UPDATE

BEFORE UPDATE FOR EACH ROW

AFTER UPDATE

AFTER UPDATE FOR EACH ROW

BEFORE DELETE

BEFORE DELETE FOR EACH ROW

AFTER DELETE

AFTER DELETE FOR EACH ROW

6.2.3觸發器觸發次序

1. 執行 BEFORE語句級觸發器;

2. 對與受語句影響的每一行:

l 執行 BEFORE行級觸發器

l 執行 DML語句

l 執行 AFTER行級觸發器

3. 執行 AFTER語句級觸發器

?

6.2.4創建DML觸發器

????觸發器名與過程名和包的名字不一樣,它是單獨的名字空間,因而觸發器名可以和表或過程有相同的名字,但在一個模式中觸發器名不能相同。

1. DML觸發器的限制

??CREATE TRIGGER語句文本的字符長度不能超過32KB;

觸發器體內的SELECT 語句只能為SELECT … INTO …結構,或者為定義游標所使用的SELECT 語句。

觸發器中不能使用數據庫事務控制語句 COMMIT; ROLLBACK, SVAEPOINT

由觸發器所調用的過程或函數也不能使用數據庫事務控制語句;

觸發器中不能使用LONG, LONG RAW 類型;

觸發器內可以參照LOB 類型列的列值,但不能通過 :NEW 修改LOB列中的數據;

?

2.DML觸發器基本要點

觸發時機:指定觸發器的觸發時間。如果指定為BEFORE,則表示在執行DML操作之前觸發,以便防止某些錯誤操作發生或實現某些業務規則;如果指定為AFTER,則表示在執行DML操作之后觸發,以便記錄該操作或做某些事后處理。

觸發事件:引起觸發器被觸發的事件,即DML操作(INSERT、UPDATE、DELETE)。既可以是單個觸發事件,也可以是多個觸發事件的組合(只能使用OR邏輯組合,不能使用AND邏輯組合)。

條件謂詞:當在觸發器中包含多個觸發事件(INSERT、UPDATE、DELETE)的組合時,為了分別針對不同的事件進行不同的處理,需要使用ORACLE提供的如下條件謂詞。

1)INSERTING:當觸發事件是INSERT時,取值為TRUE,否則為FALSE。

2)UPDATING [(column_1,column_2,…,column_x)]:當觸發事件是UPDATE ?????時,如果修改了column_x列,則取值為TRUE,否則為FALSE。其中column_x是可選的。

3)DELETING:當觸發事件是DELETE時,則取值為TRUE,否則為FALSE。

觸發對象:指定觸發器是創建在哪個表、視圖上。

觸發類型:是語句級還是行級觸發器。

觸發條件:由WHEN子句指定一個邏輯表達式,只允許在行級觸發器上指定觸發條件,指定UPDATING后面的列的列表。

?

使用觸發器謂詞

????ORACLE 提供三個參數INSERTING, UPDATING, DELETING 用于判斷觸發了哪些操作。

3-1-4 觸發器謂詞

謂詞

行為

INSERTING

如果觸發語句是 INSERT 語句,則為TRUE,否則為FALSE

UPDATING

如果觸發語句是 UPDATE語句,則為TRUE,否則為FALSE

DELETING

如果觸發語句是 DELETE 語句,則為TRUE,否則為FALSE

?

示例6.8: 建立一個觸發器, 當職工表 emp 表被刪除一條記錄時,把被刪除記錄寫到職工表刪除日志表中去。


示例6.9:限制對Departments表修改(包括INSERT,DELETE,UPDATE)的時間范圍,即不允許在非工作時間修改departments表。


創建替代(INSTEAD OF)觸發器

創建觸發器的一般語法是:

?

CREATE [OR REPLACE] TRIGGER trigger_name
INSTEAD OF
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.] view_name --只能定義在視圖上
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ] --因為INSTEAD OF觸發器只能在行級上觸發,所以沒有必要指定
[WHEN condition]
PL/SQL_block | CALL procedure_name;

?

其中: INSTEAD OF 選項使ORACLE激活觸發器,而不執行觸發事件。只能對視圖和對象視圖建立INSTEAD OF觸發器,而不能對表、模式和數據庫建立INSTEAD OF 觸發器。

FOR EACH ROW選項說明觸發器為行觸發器。行觸發器和語句觸發器的區別表現在:行觸發器要求當一個DML語句操走影響數據庫中的多行數據時,對于其中的每個數據行,只要它們符合觸發約束條件,均激活一次觸發器;而語句觸發器將整個語句操作作為觸發事件,當它符合約束條件時,激活一次觸發器。當省略FOR EACH ROW 選項時,BEFORE 和AFTER 觸發器為語句觸發器,而INSTEAD OF 觸發器則為行觸發器。

?REFERENCING 子句說明相關名稱,在行觸發器的PL/SQL塊和WHEN 子句中可以使用相關名稱參照當前的新、舊列值,默認的相關名稱分別為OLD和NEW。觸發器的PL/SQL塊中應用相關名稱時,必須在它們之前加冒號(:),但在WHEN子句中則不能加冒號。

WHEN 子句說明觸發約束條件。Condition 為一個邏輯表達時,其中必須包含相關名稱,而不能包含查詢語句,也不能調用PL/SQL 函數。WHEN 子句指定的觸發約束條件只能用在BEFORE 和AFTER 行觸發器中,不能用在INSTEAD OF 行觸發器和其它類型的觸發器中。

INSTEAD_OF 用于對視圖的DML觸發,由于視圖有可能是由多個表進行聯結(join)而成,因而并非是所有的聯結都是可更新的。但可以按照所需的方式執行更新,例如下面情況:

示例3.13:創建instead of觸發器

6.1.13 創建視圖

?

在此視圖中直接刪除是非法:

SQL>DELETE FROM emp_view WHERE deptno=10;

ERROR 位于第 1 行:

ORA-01732: 此視圖的數據操縱操作非法

但是我們可以創建INSTEAD_OF觸發器來為 DELETE 操作執行所需的處理,即刪除EMP表中所有基準行:

?


DELETE FROM emp_view WHERE deptno=10;
DROP TRIGGER emp_view_delete;
DROP VIEW emp_view;

?

創建INSTEAD OF觸發器需要注意以下幾點:

1.只能被創建在視圖上,并且該視圖沒有指定WITH CHECK OPTION選項。

????????2.不能指定BEFORE 或 AFTER選項。

3.FOR EACH ROW子可是可選的,即INSTEAD OF觸發器只能在行級上觸發、或只能是行級觸發器,沒有必要指定。

4.沒有必要在針對一個表的視圖上創建INSTEAD OF觸發器,只要創建DML觸發器就可以了。

?

6.2.6創建系統事件觸發器

????ORACLE ?11G提供的系統事件觸發器可以在DDL或數據庫系統上被觸發。DDL指的是數據定義語言,如CREATE 、ALTER及DROP 等。而數據庫系統事件包括數據庫服務器的啟動或關閉,用戶的登錄與退出、數據庫服務錯誤等。創建系統觸發器的語法如下:

創建觸發器的一般語法是:

CREATE OR REPLACE TRIGGER [sachema.]trigger_name
{BEFORE|AFTER}
{ddl_event_list | database_event_list}
ON { DATABASE | [schema.]SCHEMA }
[WHEN condition]
PL/SQL_block | CALL procedure_name;

?

其中: ddl_event_list:一個或多個DDL 事件,事件間用 OR 分開;

?database_event_list:一個或多個數據庫事件,事件間用 OR 分開;

?系統事件觸發器既可以建立在一個模式上,又可以建立在整個數據庫上。當建立在模式(SCHEMA)之上時,只有模式所指定用戶的DDL操作和它們所導致的錯誤才激活觸發器, 默認時為當前用戶模式。當建立在數據庫(DATABASE)之上時,該數據庫所有用戶的DDL操作和他們所導致的錯誤,以及數據庫的啟動和關閉均可激活觸發器。要在數據庫之上建立觸發器時,要求用戶具有ADMINISTER DATABASE TRIGGER權限。

?

事件

允許的時機

說明

STARTUP

AFTER

啟動數據庫實例之后觸發

SHUTDOWN

BEFORE

關閉數據庫實例之前觸發(非正常關閉不觸發)

SERVERERROR

AFTER

數據庫服務器發生錯誤之后觸發

LOGON

AFTER

成功登錄連接到數據庫后觸發

LOGOFF

BEFORE

開始斷開數據庫連接之前觸發

CREATE

BEFORE,AFTER

在執行CREATE語句創建數據庫對象之前、之后觸發

DROP

BEFORE,AFTER

在執行DROP語句刪除數據庫對象之前、之后觸發

ALTER

BEFORE,AFTER

在執行ALTER語句更新數據庫對象之前、之后觸發

DDL

BEFORE,AFTER

在執行大多數DDL語句之前、之后觸發

GRANT

BEFORE,AFTER

執行GRANT語句授予權限之前、之后觸發

REVOKE

BEFORE,AFTER

執行REVOKE語句收權限之前、之后觸犯發

RENAME

BEFORE,AFTER

執行RENAME語句更改數據庫對象名稱之前、之后觸犯發

AUDIT /NOAUDIT

BEFORE,AFTER

執行AUDIT或NOAUDIT進行審計或停止審計之前、之后觸發

3-1-5:系統觸發器的種類和事件出現的時機(前或后)

?

?

示例3.15:創建觸發器,存放有關事件信息。


?

?

示例3.16:創建登錄、退出觸發器。

?


?

6.2.7重新編譯觸發器

如果在觸發器內調用其它函數或過程,當這些函數或過程被刪除或修改后,觸發器的狀態將被標識為無效。當DML語句激活一個無效觸發器時,ORACLE將重新編譯觸發器代碼,如果編譯時發現錯誤,這將導致DML語句執行失敗。

PL/SQL程序中可以調用ALTER TRIGGER語句重新編譯已經創建的觸發器,格式為: ???????????

ALTER TRIGGER [schema.] trigger_name COMPILE [ DEBUG]

???????其中:DEBUG 選項要器編譯器生成PL/SQL 程序條使其所使用的調試代碼。

6.2.8 刪除和使能觸發器

DROP TRIGGER trigger_name;

當刪除其他用戶模式中的觸發器名稱,需要具有DROP ANY TRIGGER系統權限,當刪除建立在數據庫上的觸發器時,用戶需要具有ADMINISTER DATABASE TRIGGER系統權限。

此外,當刪除表或視圖時,建立在這些對象上的觸發器也隨之刪除。

?

6.2.9 禁用或啟用觸發器

數據庫TRIGGER 的狀態:

1. 有效狀態(ENABLE):當觸發事件發生時,處于有效狀態的數據庫觸發器TRIGGER 將被觸發。

2. 無效狀態(DISABLE):當觸發事件發生時,處于無效狀態的數據庫觸發器TRIGGER 將不會被觸發,此時就跟沒有這個數據庫觸發器(TRIGGER) 一樣。

數據庫TRIGGER的這兩種狀態可以互相轉換。格式為:

ALTER TIGGER trigger_name [DISABLE | ENABLE ];
--例:ALTER TRIGGER emp_view_delete DISABLE;

ALTER TRIGGER語句一次只能改變一個觸發器的狀態,而ALTER TABLE語句則一次能夠改變與指定表相關的所有觸發器的使用狀態。格式為: ????????????

ALTER TABLE [schema.]table_name {ENABLE|DISABLE} ALL TRIGGERS;

--例:使表EMP 上的所有TRIGGER 失效:
ALTER TABLE emp DISABLE ALL TRIGGERS;

?

6.2.10觸發器和數據字典

相關數據字典:USER_TRIGGERS、ALL_TRIGGERS、DBA_TRIGGERS?

SELECT TRIGGER_NAME, TRIGGER_TYPE, TRIGGERING_EVENT,
TABLE_OWNER, BASE_OBJECT_TYPE, REFERENCING_NAMES,
STATUS, ACTION_TYPE
FROM user_triggers;

?

?

?

?

?

??本章總結

??游標提供了一種對具有多行數據查詢結果集中的每一行數據分別進行單獨處理的方法。

??游標分為顯式游標和隱含游標兩種。其中,隱含游標用于處理SELECTINTO和DML語句,而顯式游標則用于處理SELECT語句返回的多行數據。

??顯式游標包括定義游標?(DECLARE)、打開游標?(OPEN)、提取數據?(FETCH)和關閉游標?(CLOSE)4個階段

??參數游標是指帶有參數的游標。在定義了參數游標之后,使用不同參數值多次打開游標可以生成不同的結果集。

??游標For循環時,?Oracle會隱含地打開游標,提取游標數據并關閉游標

??當執行一條DML語句或者?SELECT…INTO語句時,都會創建一個隱含游標。隱含游標的名稱是?SQL,不能對?SQL游標顯式地執行OPEN、FETCH和?CLOSE語句。Oracle 隱式地打開、提取,并總是自動地關閉?SQL 游標。隱含游標屬性包括?SQL%FOUND、SQL%NOTFOUND、SQL%ROWCOUNT、SQL%ISOPEN等。

??觸發器在數據庫里以獨立的對象存儲,它與存儲過程和函數不同的是,存儲過程與函數需要用戶顯示調用才執行,而觸發器是由一個事件來啟動運行。

??觸發器分為DML觸發器、替代觸發器、系統觸發器

??觸發器分為語句級觸發器和行級觸發器

??

?

?

任務實訓部分

1創建和使用游標

訓練技能點

??游標的使用

需求說明

假定存在一張記錄學員分數的表tb_score,其數據結構如圖3.2.6所示。要求使用游標更新tb_score中的rank字段,求出每位學員總分名次。

?


?

實現思路

(1) 創建過程,命名為“proc_update_rank”,在其中定義基于tb_score表的可更新游標,用于根據總分更新rank字段

?


?(2) 執行proc_update_rank過程,實現更新rank字段并求名次的功能

?


?


2.?任意執行一個update操作,用隱式游標sql的屬性%found,%notfound,%rowcount,%isopen觀察update語句的執行情況。

訓練技能點:

????隱式游標sql的屬性的使用

?

?

3.將每位員工工作了多少年零多少月零多少天輸出出來

技能訓練點:

游標FOR循環

?

?

4.輸入部門編號,按照下列加薪比例執行(用CASE實現,創建一個emp1表,修改emp1表的數據),并將更新前后的數據輸出出來
-- ?deptno ?raise(%)
-- ?10 ?????5%
-- ?20 ?????10%
-- ?30 ?????15%
-- ?40 ?????20%
-- ?加薪比例以現有的sal為標準

技能訓練點:

更改游標的當前行

?

?

5.觸發器的使用

技能訓練點:

使用觸發器實現自動編號,在SQL SERVER數據庫中,如果將字段屬性設置為IDENTITY,則該字段值由SQL Server在插入數據時自動填充。但Oracle中沒有此功能,需要使用觸發器來實現自動編號功能。

(1)?創建序列,命名為“stu_seq”,創建一張表,命名為“tb_stud”

?

(2)?tb_stud表中創建行觸發器以實現自動編號

?

6.觸發器實現計算列

(1). 創建一張表,命名為“tb_stud_score”

?

(2). 在表tb_stud_score中創建行級觸發器,命名為“tr_stud_score”

?

?

??本章總結

?

??Oracle游標和觸發器

n?Oracle游標

n?Oracle觸發器

?

鞏固練習

一.選擇題

1. 在使用顯式游標時,在執行了語句?( ?)后應該檢查游標是否包含行。

????A. OPEN

????B. FETCH

????C. CLOSE

????D. CURSOR?

2.下列選項中,有關觸發器和存儲過程的描述正確的是()

????A.二者都可以傳遞參數

????B.二者都可以被其他程序調用

????C.兩種模塊中都可以包含數據庫事務語句

????D.二者創建的系統權限不同

3.關于行級觸發器的偽記錄,下列說法正確的是()

????A. INSERT事件觸發器中,可以使用:OLD偽記錄

????B.DELETE事件觸發器中,可以使用:NEW偽記錄

????C.UPDATE事件觸發器中,可以使用:NEW偽記錄

????D.UPDATE事件觸發器中,可以使用:OLD偽記錄

4.下列選項中,關于替代觸發器的描述正確的是()

???A.替代觸發器創建在表上

???B.替代觸發器可以創建在數據庫上

???C.通過替代觸發器可以向基表中插入數據

???D.通過替代觸發器可以向視圖中插入數據

5.下列事件中屬于DDL事件的是()

???A.INSERT

???B.LOGON

???C.DROP

???D.SERVERERROR


總結

以上是生活随笔為你收集整理的游标和触发器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。