MYSQL 儲存過程,游標和觸發器

2021-06-14 18:31:47 字數 3288 閱讀 6412

1.儲存過程(procedure)

mysql 儲存過程是從 mysql 5.0 開始增加的新功能。儲存過程的優點有一籮筐。不過最主要的還是執行效率和sql **封裝。特別是 sql **封裝功能,如果沒有儲存過程,在外部程式訪問資料庫時(例如 php),要組織很多 sql 語句。特別是業務邏輯複雜的時候,一大堆的 sql 和條件夾雜在 php **中,讓人不寒而慄。現在有了 mysql 儲存過程,業務邏輯可以封裝儲存過程中,這樣不僅容易維護,而且執行效率也高。

建立 mysql 儲存過程的簡單語法為:

create procedure procedure_name

([in|out|inout] 引數 datatype

)begin

mysql 語句;

end;

mysql> drop

procedure

if-> create

-> begin

-> declare maxid int;

-> select

-> select

-> end

-> //

2.游標

游標是從資料表中提取出來的資料,以臨時表的形式存放在記憶體中,在游標中有乙個資料指標,在初始狀態下指向的是首記錄,利用fetch語句可以移動該指標,從而對游標中的資料進行各種操作,然後將操作結果寫回資料表中。

游標是系統為使用者開設的乙個

資料緩衝區

,存放sql語句的執行結果。每個游標區都有乙個名字。使用者可以用

sql語句逐一從游標中獲取記錄,並賦給主變數,交由主語言進一步處理。主語言是面向記錄的,一組主變數一次只能存放一條記錄。僅使用主變數並不能完全滿足sql語句向應用程式輸出資料的要求。嵌入式sql引入了游標的概念,用來協調這兩種不同的處理方式。在資料庫開發過程中,當你檢索的資料只是一條記錄時,你所編寫的事務語句**往往使用select insert 語句。但是我們常常會遇到這樣情況,即從某一結果集中逐一地讀取一條記錄。那麼如何解決這種問題呢?游標為我們提供了一種極為優秀的解決方案。

declare cursor_name cursor

for select_statement;

注意:mysql的游標是向前唯讀的,也就是說,你只能順序地從開始往後讀取結果集,不能從後往前,也不能直接跳到中間的記錄.

/*初始化*/  

drop

procedure

ifexists usecursor //

/*建立 儲存過程

create */

create

procedure usecursor()

begin

/*區域性變數的定義

declare*/

declare tmpname varchar(20) default

'' ;

declare allname varchar(255) default

'' ;

declare cur1 cursor

forselect name from test.level ;

/* mysql 不知道為什麼用異常加入判斷 ? * 此請參考官方文件 20.2.11. 游標 游標 * 這把 游標 異常後 捕捉 * 並設定 迴圈使用 變數 tmpname 為 null 跳出迴圈。 */

declare

continue handler for

sqlstate

'02000'

set tmpname = null;

/*開游標*/

open cur1;

/*游標向下走一步*/

fetch cur1 into tmpname;

/* 迴圈體 這很明顯 把游標查詢出的 name 都加起並用 ; 號隔開 */

while ( tmpname is

notnull) do

set tmpname = concat(tmpname ,";") ;

set allname = concat(allname ,tmpname) ;

/*游標向下走一步*/

fetch cur1 into tmpname;

endwhile;

close cur1;

select allname ;

end;

//call usecursor()

//

3.觸發器

觸發器是特定事件出現的時候,自動執行的**塊。類似於儲存過程,觸發器與儲存過程的區別在於:儲存過程是由使用者或應用程式顯式呼叫的,而觸發器是不能被直接呼叫的。

create

trigger trigger_name trigger_time trigger_event on tbl_name for

each

rowbegin trigger_stmt end;

trigger_name:觸發器的名字,我常用的命名規則t_name_tablename_(b|a)(i|u|d),t:觸發器標識,name:英文名,tablename:表名,b(before):標識是觸發事件之前,a(after):標識觸發事件之後,i(insert):標識insert事件,u(update):標識update事件,d(delete):標識delete事件; 

trigger_time:觸發時間(before或after) 

trigger_event:事件名(insert或update或delete) 

tbl_name:表名(必須是永久性表) 

trigger_stmt:執行語句(可以是復合語名),使用別名old和new,能夠引用與觸發程式相關的表中的列。

create

trigger t22_bibefore insert on t22for

each

rowbegin

set @x = 'trigger was activated!';set

new.s1 = 55;end;//

在表t22中,在插入一條資料之前,顯示'trigger was activated!',並且將插入的這條資料的s1值設為55.

儲存過程,游標,觸發器

語法 create or replace procedure 儲存過程名稱 引數名1 in out 資料型別,引數名2 in out 資料型別,as is 宣告變數 begin 過程化語句 end 根據員工編號得到員工的年薪 create or replace procedure getyearsa...

包 儲存過程 觸發器 游標

create or replace package emp package as v pi constant number 3.14 定義常量 type v cur is ref cursor 引用游標定義 定義過程 procedure emp insert p ename varchar2,p j...

觸發器 儲存過程 游標等

觸發器有兩種after和before,區別在於每次提交事務觸發一次和每一行資料的更新都觸發一次,使用時候要注意,以免達不到目的 oracle產生資料庫觸發器的語法為 create or replace trigger 觸發器名 觸發時間 觸發事件 on 表名 for each row pl sql ...