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> drop2.游標procedure
if-> create
-> begin
-> declare maxid int;
-> select
-> select
-> end
-> //
游標是從資料表中提取出來的資料,以臨時表的形式存放在記憶體中,在游標中有乙個資料指標,在初始狀態下指向的是首記錄,利用fetch語句可以移動該指標,從而對游標中的資料進行各種操作,然後將操作結果寫回資料表中。
游標是系統為使用者開設的乙個
資料緩衝區
,存放sql語句的執行結果。每個游標區都有乙個名字。使用者可以用
sql語句逐一從游標中獲取記錄,並賦給主變數,交由主語言進一步處理。主語言是面向記錄的,一組主變數一次只能存放一條記錄。僅使用主變數並不能完全滿足sql語句向應用程式輸出資料的要求。嵌入式sql引入了游標的概念,用來協調這兩種不同的處理方式。在資料庫開發過程中,當你檢索的資料只是一條記錄時,你所編寫的事務語句**往往使用select insert 語句。但是我們常常會遇到這樣情況,即從某一結果集中逐一地讀取一條記錄。那麼如何解決這種問題呢?游標為我們提供了一種極為優秀的解決方案。
declare cursor_name cursor注意:mysql的游標是向前唯讀的,也就是說,你只能順序地從開始往後讀取結果集,不能從後往前,也不能直接跳到中間的記錄.for select_statement;
/*初始化*/3.觸發器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()
//
觸發器是特定事件出現的時候,自動執行的**塊。類似於儲存過程,觸發器與儲存過程的區別在於:儲存過程是由使用者或應用程式顯式呼叫的,而觸發器是不能被直接呼叫的。
createtrigger_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 trigger_name trigger_time trigger_event on tbl_name for
each
rowbegin trigger_stmt end;
trigger_time:觸發時間(before或after)
trigger_event:事件名(insert或update或delete)
tbl_name:表名(必須是永久性表)
trigger_stmt:執行語句(可以是復合語名),使用別名old和new,能夠引用與觸發程式相關的表中的列。
create在表t22中,在插入一條資料之前,顯示'trigger was activated!',並且將插入的這條資料的s1值設為55.trigger t22_bibefore insert on t22for
each
rowbegin
set @x = 'trigger was activated!';set
new.s1 = 55;end;//
儲存過程,游標,觸發器
語法 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 ...