程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> Mysql觸發器、模糊查找、存儲過程、內置函數,mysql 內置函數

Mysql觸發器、模糊查找、存儲過程、內置函數,mysql 內置函數

編輯:MySQL綜合教程

Mysql觸發器、模糊查找、存儲過程、內置函數,mysql 內置函數


Mysql觸發器、模糊查找、存儲過程、內置函數


原本覺得Mysql的一些知識還是差不多了,但是在實際上在項目上用的時候,發現什麼都忘記了。現在重新回顧一下,順便做個筆記。

觸發器                                                                                        

  • 查看所有觸發器
    SELECT * FROM information_schema.`TRIGGERS`;
  • 觸發器的應用

    背景,兩張表:

    功能是在yyd_table中插入數據,yyd_那麼中也觸發插入數據。

    CREATE TRIGGER yyd_tri AFTER INSERT ON yyd_table FOR EACH ROW BEGIN INSERT INTO yyd_name VALUES (NULL,"name_yyd"); END;

    執行效果:

    對yyd_name插入的時候將name改為4:

    CREATE TRIGGER yyd_tri1 BEFORE INSERT ON yyd_name FOR EACH ROW
    BEGIN
    SET @x = "123321";
    SET NEW.name = "4";
    END;
  • 刪除觸發器
    DROP trigger  yyd_tri;
  • 可能遇到的問題

    如果你在觸發器裡面對剛剛插入的數據進行了 insert/update, 會造成循環的調用。 如:

    create trigger test before update on test for each row 
    update test set NEW.updateTime = NOW() where id=NEW.ID; 
    END

    應該使用set:

    create trigger test before update on test for each row
     set NEW.updateTime = NOW(); 
    END
  • 語法
    CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt

    trigger_time是觸發程序的動作時間。它可以是BEFORE或AFTER

    trigger_event指明了激活觸發程序的語句的類型。trigger_event可以是下述值之一:

  • INSERT:將新行插入表時激活觸發程序,例如,通過INSERT、LOAD DATA和REPLACE語句。
  • UPDATE:更改某一行時激活觸發程序,例如,通過UPDATE語句。
  • DELETE:從表中刪除某一行時激活觸發程序,例如,通過DELETE和REPLACE語句。

    模糊查找                                                                                     

    SELECT 字段 FROM 表 WHERE 某字段 Like 條件
  • 匹配模式
  • %:表示任意0個或多個字符。可匹配任意類型和長度的字符。
    SELECT * FROM [user] WHERE u_name LIKE '%三%'

    將會把u_name為“張三”,“張貓三”、“三腳貓”,“唐三藏”等等有“三”的記錄全找出來。

    另外,如果需要找出u_name中既有“三”又有“貓”的記錄,請使用and條件

    SELECT * FROM [user] WHERE u_name LIKE '%三%' AND u_name LIKE '%貓%'

     

  • [ ] :表示括號內所列字符中的一個(類似正則表達式)。指定一個字符、字符串或范圍,要求所匹配對象為它們中的任一個。
  • [^ ] :表示不在括號所列之內的單個字符。其取值和 [] 相同,但它要求所匹配對象為指定字符以外的任一個字符。
  • _ : 表示任意單個字符。匹配單個任意字符,它常用來限制表達式的字符長度語句。
    SELECT * FROM [user] WHERE u_name LIKE '_三_'

    只找出“唐三藏”這樣u_name為三個字且中間一個字是“三”的;

    SELECT * FROM [user] WHERE u_name LIKE '三__';

    只找出“三腳貓”這樣name為三個字且第一個字是“三”的;

    存儲過程                                                                                     

  • 格式
    mysql> DELIMITER //  
    mysql> CREATE PROCEDURE proc1(OUT s int)  
        -> BEGIN 
        -> SELECT COUNT(*) INTO s FROM user;  
        -> END 
        -> //  
    mysql> DELIMITER ;
  • 這裡需要注意的是DELIMITER //和DELIMITER ;兩句,DELIMITER是分割符的意思,這裡把分隔符給替換成//。
  • 存儲過程根據需要可能會有輸入、輸出、輸入輸出參數,這裡有一個輸出參數s,類型是int型,如果有多個參數用","分割開。
  • 程體的開始與結束使用BEGIN與END進行標識。

    MySQL存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN,OUT,INOUT,形式如:

    CREATE PROCEDURE([[IN |OUT |INOUT ] 參數名 數據類形...])

    IN 輸入參數:表示該參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為默認值

    OUT 輸出參數:該值可在存儲過程內部被改變,並可返回

    INOUT 輸入輸出參數:調用時指定,並且可被改變和返回

    只舉一個例子:

    mysql > DELIMITER //  
    mysql > CREATE PROCEDURE demo_in_parameter(IN p_in int)  
    -> BEGIN   
    -> SELECT p_in;   
    -> SET p_in=2;   
    -> SELECT p_in;   
    -> END;   
    -> //  
    mysql > DELIMITER ;

    結果:

    mysql > SET @p_in=1;  
    mysql > CALL demo_in_parameter(@p_in);  
    +------+  
    | p_in |  
    +------+  
    |   1  |   
    +------+  
     
    +------+  
    | p_in |  
    +------+  
    |   2  |   
    +------+  
     
    mysql> SELECT @p_in;  
    +-------+  
    | @p_in |  
    +-------+  
    |  1    |  
    +-------+

     

  • 變量
    DECLARE variable_name [,variable_name...] datatype [DEFAULT value];

    其中,datatype為MySQL的數據類型,如:int, float, date, varchar(length)

    比如:

    DECLARE l_int int unsigned default 4000000;  
    DECLARE l_numeric number(8,2) DEFAULT 9.95;  
    DECLARE l_date date DEFAULT '1999-12-31';  
    DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59';  
    DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';

    賦值:

    SET 變量名 = 表達式值 [,variable_name = expression ...]

    用戶變量:

    mysql > SELECT 'Hello World' into @x;  
    mysql > SELECT @x;  
    +-------------+  
    |   @x        |  
    +-------------+  
    | Hello World |  
    +-------------+  
    mysql > SET @y='Goodbye Cruel World';  
    mysql > SELECT @y;  
    +---------------------+  
    |     @y              |  
    +---------------------+  
    | Goodbye Cruel World |  
    +---------------------+  
     
    mysql > SET @z=1+2+3;  
    mysql > SELECT @z;  
    +------+  
    | @z   |  
    +------+  
    |  6   |  
    +------+

    變量與存儲過程:

    mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');  
    mysql > SET @greeting='Hello';  
    mysql > CALL GreetWorld( );  
    +----------------------------+  
    | CONCAT(@greeting,' World') |  
    +----------------------------+  
    |  Hello World               |  
    +----------------------------+  
    
    mysql> CREATE PROCEDURE p1()   SET @last_procedure='p1';  
    mysql> CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_proc);  
    mysql> CALL p1( );  
    mysql> CALL p2( );  
    +-----------------------------------------------+  
    | CONCAT('Last procedure was ',@last_proc  |  
    +-----------------------------------------------+  
    | Last procedure was p1                         |  
    +-----------------------------------------------+
  • 變量作用域:

    mysql > DELIMITER //  
    mysql > CREATE PROCEDURE proc3()  
         -> begin 
         -> declare x1 varchar(5) default 'outer';  
         -> begin 
         -> declare x1 varchar(5) default 'inner';  
         -> select x1;  
         -> end;  
         -> select x1;  
         -> end;  
         -> //  
    mysql > DELIMITER ;

    內部的變量在其作用域范圍內享有更高的優先權,當執行到end時,內部變量消失,此時已經在其作用域外,變量不再可見了,應為在存儲過程外再也不能找到這個申明的變量,但是你可以通過out參數或者將其值指派給會話變量來保存其值。

  • 存儲過程的查詢
  • select name from mysql.proc where db=’數據庫名’;
    select routine_name from information_schema.routines where routine_schema='數據庫名';
    show procedure status where db='數據庫名';
    • 存儲過程的刪除
    DROP PROCEDURE
    • if-then -else語句
    mysql > DELIMITER //  
    mysql > CREATE PROCEDURE proc2(IN parameter int)  
         -> begin 
         -> declare var int;  
         -> set var=parameter+1;  
         -> if var=0 then 
         -> insert into t values(17);  
         -> end if;  
         -> if parameter=0 then 
         -> update t set s1=s1+1;  
         -> else 
         -> update t set s1=s1+2;  
         -> end if;  
         -> end;  
         -> //  
    mysql > DELIMITER ;
    • case語句
    mysql > DELIMITER //  
    mysql > CREATE PROCEDURE proc3 (in parameter int)  
         -> begin 
         -> declare var int;  
         -> set var=parameter+1;  
         -> case var  
         -> when 0 then   
         -> insert into t values(17);  
         -> when 1 then   
         -> insert into t values(18);  
         -> else   
         -> insert into t values(19);  
         -> end case;  
         -> end;  
         -> //  
    mysql > DELIMITER ;
    • while ···· end while語句
    mysql > DELIMITER //  
    mysql > CREATE PROCEDURE proc4()  
         -> begin 
         -> declare var int;  
         -> set var=0;  
         -> while var<6 do  
         -> insert into t values(var);  
         -> set var=var+1;  
         -> end while;  
         -> end;  
         -> //  
    mysql > DELIMITER ;
    • repeat···· end repeat語句
    mysql > DELIMITER //  
    mysql > CREATE PROCEDURE proc5 ()  
         -> begin   
         -> declare v int;  
         -> set v=0;  
         -> repeat  
         -> insert into t values(v);  
         -> set v=v+1;  
         -> until v>=5  
         -> end repeat;  
         -> end;  
         -> //  
    mysql > DELIMITER ;

    類似do…while語句。

    • loop ·····end loop語句
    mysql > DELIMITER //  
    mysql > CREATE PROCEDURE proc6 ()  
         -> begin 
         -> declare v int;  
         -> set v=0;  
         -> LOOP_LABLE:loop  
         -> insert into t values(v);  
         -> set v=v+1;  
         -> if v >=5 then 
         -> leave LOOP_LABLE;  
         -> end if;  
         -> end loop;  
         -> end;  
         -> //  
    mysql > DELIMITER ;

    loop循環不需要初始條件,這點和while 循環相似,同時和repeat循環一樣不需要結束條件, leave語句的意義是離開循環。

    • ITERATE迭代
    mysql > DELIMITER //  
    mysql > CREATE PROCEDURE proc10 ()  
         -> begin 
         -> declare v int;  
         -> set v=0;  
         -> LOOP_LABLE:loop  
         -> if v=3 then   
         -> set v=v+1;  
         -> ITERATE LOOP_LABLE;  
         -> end if;  
         -> insert into t values(v);  
         -> set v=v+1;  
         -> if v>=5 then 
         -> leave LOOP_LABLE;  
         -> end if;  
         -> end loop;  
         -> end;  
         -> //  
    mysql > DELIMITER ;

    通過引用復合語句的標號,來從新開始復合語句。

    內置函數                                                                                      

    • 字符串

    CHARSET(str) //返回字串字符集

    CONCAT (string2 [,... ]) //連接字串

    INSTR (string ,substring ) //返回substring首次在string中出現的位置,不存在返回0

    LCASE (string2 ) //轉換成小寫

    LEFT (string2 ,length ) //從string2中的左邊起取length個字符

    LENGTH (string ) //string長度

    LOAD_FILE (file_name ) //從文件讀取內容

    LOCATE (substring , string [,start_position ] ) 同INSTR,但可指定開始位置

    LPAD (string2 ,length ,pad ) //重復用pad加在string開頭,直到字串長度為length

    LTRIM (string2 ) //去除前端空格

    REPEAT (string2 ,count ) //重復count次

    REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替換search_str

    RPAD (string2 ,length ,pad) //在str後用pad補充,直到長度為length

    RTRIM (string2 ) //去除後端空格

    STRCMP (string1 ,string2 ) //逐字符比較兩字串大小,

    SUBSTRING (str , position [,length ]) //從str的position開始,取length個字符,

    注:mysql中處理字符串時,默認第一個字符下標為1,即參數position必須大於等於1

    TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符

    UCASE (string2 ) //轉換成大寫

    RIGHT(string2,length) //取string2最後length個字符

    SPACE(count) //生成count個空格

    • 數字數學

    ABS (number2 ) //絕對值

    BIN (decimal_number ) //十進制轉二進制

    CEILING (number2 ) //向上取整

    CONV(number2,from_base,to_base) //進制轉換

    FLOOR (number2 ) //向下取整

    FORMAT (number,decimal_places ) //保留小數位數

    HEX (DecimalNumber ) //轉十六進制

    注:HEX()中可傳入字符串,則返回其ASC-11碼,如HEX('DEF')返回4142143也可以傳入十進制整數,返回其十六進制編碼,如HEX(25)返回19

    LEAST (number , number2 [,..]) //求最小值

    MOD (numerator ,denominator ) //求余

    POWER (number ,power ) //求指數

    RAND([seed]) //隨機數

    ROUND (number [,decimals ]) //四捨五入,decimals為小數位數]

    • 日期時間

    ADDTIME (date2 ,time_interval ) //將time_interval加到date2

    CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //轉換時區

    CURRENT_DATE ( ) //當前日期

    CURRENT_TIME ( ) //當前時間

    CURRENT_TIMESTAMP ( ) //當前時間戳

    DATE (datetime ) //返回datetime的日期部分

    DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或時間

    DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式顯示datetime

    DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上減去一個時間

    DATEDIFF (date1 ,date2 ) //兩個日期差

    DAY (date ) //返回日期的天

    DAYNAME (date ) //英文星期

    DAYOFWEEK (date ) //星期(1-7) ,1為星期天

    DAYOFYEAR (date ) //一年中的第幾天

    EXTRACT (interval_name FROM date ) //從date中提取日期的指定部分

    MAKEDATE (year ,day ) //給出年及年中的第幾天,生成日期串

    MAKETIME (hour ,minute ,second ) //生成時間串

    MONTHNAME (date ) //英文月份名

    NOW ( ) //當前時間

    SEC_TO_TIME (seconds ) //秒數轉成時間

    STR_TO_DATE (string ,format ) //字串轉成時間,以format格式顯示

    TIMEDIFF (datetime1 ,datetime2 ) //兩個時間差

    TIME_TO_SEC (time ) //時間轉秒數]

    WEEK (date_time [,start_of_week ]) //第幾周

    YEAR (datetime ) //年份

    DAYOFMONTH(datetime) //月的第幾天

    HOUR(datetime) //小時

    LAST_DAY(date) //date的月的最後日期

    MICROSECOND(datetime) //微秒

    MONTH(datetime) //月

    MINUTE(datetime) //分返回符號,正負或0

    SQRT(number2) //開平方

    我是天王蓋地虎的分割線                                                                

    參考:http://www.cnblogs.com/GT_Andy/archive/2009/12/25/1921914.html

    參考:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html

     

     

     

    轉載請注明出處:http://www.cnblogs.com/yydcdut/


mysql中的存儲過程、觸發器、視圖的用法

建立存儲過程

Create procedure、Create function

下面是它們的格式:
Create proceduresp_Name ([proc_parameter ])
routine_body

這裡的參數類型可以是 IN OUT INOUTT ,意思和單詞的意思是一樣的,IN 表示是傳進來的參數,
OUT 是表示傳出去的參數,INOUT 是表示傳進來但最終傳回的參數。
Create functionsp_Name ([func_parameter ])
Returns type

Routine_body
Returns type 指定了返回的類型,這裡給定的類型與返回值的類型要是一樣的,否則會報錯。

下面給出兩個簡單的例子來說明:

1、 顯示 Mysql 當前版本

執行結果
mysql> use welefen;
Database changed
mysql> delimiter // #定義//作為結束標記符號
mysql> create procedure getversion(out param1 varchar(50)) #param1為傳出參數
-> begin
-> select version() into param1; #將版本的信息賦值給 param1
-> end
-> //
Query OK, 0 rows affected (0.00 sec)

mysql> call getversion(@a); #調用getversion()這個存儲過程
-> //
Query OK, 0 rows affected (0.00 sec)

mysql> select @a;
-> //
+--------------------------+
| @a |
+--------------------------+
| 5.1.14-beta-community-nt |
+--------------------------+
1 row in set (0.00 sec)

2、 顯示”hello world”

執行結果
mysql> delimiter //
mysql> create function display(w varchar(20)) returns varchar(50)
-> begin
-> return concat('hello ‘,w);
-> end
-> //
Query OK, 0 rows affected (0.05 sec)

mysql> select display("world");
-> //
+------------------+
| display("world") |
+------------------+
| hello world |
+------------------+
1 row in set (0.02 sec)

其他操作存儲過程的語句

前面我們已經知道了怎麼創建存儲過程,下面看看其他常用的用於操作存儲過程的語句。

Alter {procedure | function} sp_Name []

Alter 語法是用來改變一個過程或函數的特征,當你想改變存儲過程或者函數的結構時可以使
用它。當然你也可以先 drop 它再 create。

Drop {procedure | function} [if exists] sp_Name

Drop 語法即用來刪除一個存儲程序或者函數,當你創建的一個存儲過程或者函數的名字已經存
在時,你想把以前的給覆蓋掉,那麼此時你就可以使用 drop ,然後在創建。

Show create {procedure | function } sp_Name

Show 語法用來顯示創建的存儲過程或者函數的信息。這裡的 show 用法跟數據表中的 show 用
法是很相似的。

Show {procedure | function} status [like 'partten']

它返回子程序的特征,如數據庫,名字,類型,創建者及創建和修改日期。如果沒有指定樣式,
根據你使用的語句,所有存儲程序和存儲函數的信息都被列出。

看了以上的幾個語法,你是不是感覺跟對表的操作很相象,那你就想對了,他們確實是很相似
的。帶著一份激動心情我們繼續往下看,你會發現很簡單。

Begin ... End 語句

通過 begin end 可以來包含多個語句,每個語句以“;”結尾。

Declare

用Declare 來聲明局部變量
Declarevar_Name type defaulevaule

Delare 條件

Declarecondition_Name CONDITION FOR condition_value

調用存儲過程

Call

格式:
Callsp_Name [parameter ]

這裡的 sp_Name 必須是由 create procedure 創建的名稱。它可以通過聲明的參數來傳回值,
它也返回受影響的行數,在 MySQL 中可以通過 mysql_affected_rows() 來獲得。

流程控制語句

IF 語句

IFsearch_condition THENstatement_list
[ELSEIFsearch_condition THENstatement_list]
[ELSEstatement_list]
END IF

CASE 語句

CASE case_value
WHEN when_value THENstatement_list
WHEN when_value THENstatement_list]
ELSEstatement_list]
END CASE

LOOP 語句

[begin_label:] LOOP
statement_list
END LOOP [end_label]
LOOP 實現了一個簡單的循環,通過 LEAVE 來退出

LEAVE 語句

LEAVE lable
退出語句,一般可以用在循環中。

ITERATE 語句

ITERATE lable
ITERATE 一般出現在 LOOP、REPEATE、WHILE 裡,意思是再次循環。

REPEATE 語句

[begin_label:] REPEAT
statement_list
UNTILsearch_condition
END REPEAT [end_label]
REPEAT 語句內的語句或語句群被重復,直至 search_condition 為真。

WHILE 語句

[begin_label:] WHILEsearch_condition DO
statement_list
END WHILE [end_label]
WHILE 語句內的語句或語句群被重復,直至 search_condition 為真。
運用實例

下面通過幾個例子來講述他們的應用:

對網站用戶的操作

為了簡單,用戶表只有用戶名和密碼的信息.在服務端,我們建立如下的表:

代碼片段
Drop table if exists user;
Create table user(
Id int unsigned not null auto_increment,
Name varchar(20) not null,
Pwd char(32) not null,
Primary key(Id)
);

添加用戶的存儲過程:

代碼片段
Delimiter //
Create procedure insertuser(in username varchar(20),in userpwd varchar(32))
Begin
Insert into welefen.user(Name,Pwd) values (username,md5(userpwd));
End
//

驗證用戶的存儲過程:

代碼片段
Delimiter //
Create procedure validateuser(in username varchar(20),out param1)
Begin
Select Pwd into param1 from welefen.user where Name=username;
End
//

修改密碼的存儲過程:

代碼片段
Delimiter //
Create procedure modifyPwd(in username varchar(20),in userpwd varchar(32))
Begin
Update welefen.user set Pwd=md5(userpwd) where Name=username;
End
//

刪除用戶的存儲過程:

代碼片段
Delimiter //
Create procedure deleteuser(in username varchar(20))
Begin
delete from welefen.user where Name=username;
End
//

在客戶端,我們給出如下的程序:

代碼片段
文件名:ProcedureUser.php
<?php

if (!mysql_connect("localhost","root","welefen")){
echo "連接數據庫失敗";
}
if (!mysql_select_db("welefen")){
echo "選擇數據庫表失敗<br>";
}

$insert_user=array("welefen","welefen");//這裡的welefen分別為用戶名、密碼
if (mysql_query("call insertuser('$insert_user[0]','$insert_user[1]')")){
echo "添加用戶$insert_user[0]成功<br>";
}else {
echo "添加用戶$insert_user[0]失敗<br>";
}

$validate_user=array("welefen","welefen");//這裡的welefen分別為用戶名、密碼
mysql_query("call validateuser('$validate_user[0]',@a)");
$Pwd=mysql_query("select @a");
$result=mysql_fetch_array($Pwd);
if ($result[0]==md5($validate_user[1])){
echo "用戶$validate_user[0]驗證正確<br>";
}else {
echo "用戶$validate_user[0]驗證錯誤<br>";
}

$modify_Pwd=array("welefen","weilefeng"); //welefen為用戶名weilefeng為新密碼
if (mysql_query("call modifyPwd('$modify_Pwd[0]','$modify_Pwd[1]')")){
echo "用戶$modigy_Pwd[0]的密碼修改成功<br>";
}else {
echo "用戶$modigy_Pwd[0]的密碼修改失敗<br>";
}

$delete_user=array("welefen"); //welefen為用戶名
if (mysql_query("call deleteuser('$delete_user[0]')")){
echo "用戶$delete_user[0]刪除成功<br>";
}else {
echo "用戶$delete_user[0]刪除失敗<br>";
}
?

程序運行的結果:

執行結果
添加用戶welefen 成功
用戶welefen 驗證正確
用戶welefen 的密碼修改成功
用戶welefen 刪除成功

以上的這個程序簡單的說明了Mysql 中的存儲過程結合PHP 的應用,當然在實際應用要比這個
復雜的多。

驗證角谷猜想

角谷猜想:給定一個整數x,若x%2=1,則x=3*x+1,否則x=x/2,如此循環下去,經過有限步驟必
能得到1。
例 如 : 初 始 整 數 為 9 , 則
9->28->14->7->22->11->34->17->52->26->13->40->20->10->5->16->8->4->2->1

為了說明存儲過程中一些語法的應用,我們通過存儲過程來實現它:

執行結果
mysql> delimiter //
mysql> create procedure jgguess(in number int)
-> begin
-> declare param1 int default 1;
-> set @a=concat(number);
-> jiaogu:loop #循環開始
-> set param1=number%2;
-> if param1=1 then set number=number*3+1; #number 為奇數,將它乘3加 1
-> else set number=number/2;
-> end if;
-> set @a=concat(@a,'->',number);
-> if number>1 then iterate jiaogu; #number 不為 1,繼續循環
-> end if;
-> leave jiaogu; #退出循環
-> end loop jiaogu;
-> end
-> //
Query OK, 0 rows affected (0.00 sec)

mysql> call jgguess(11);
-> //
Query OK, 0 rows affected (0.00 sec)

mysql> select @a//
+-------------------------------------------------------+
| @a |
+-------------------------------------------------------+
| 11->34->17->52->26->13->40->20->10->5->16->8->4->2->1 |
+-------------------------------------------------------+
1 row in set (0.02 sec)

在這個存儲過程中,你傳入的參數不能超過int 型數據的范圍,否則就會報錯。

觸發器

觸發器是與表有關的命名數據庫對象,當表上出現特定事件時,將激活該對象。例如當我們向
某個表插入一行數據時發生一個事件或者刪除某個記錄時觸發某個事件。
語法:
CREATE TRIGGER trigger_Name trigger_time trigger_event
ON tbl_Name FOR EACHROW trigger_stmt
trigger_time 是觸發器的動作時間。它可以是 BEFORE 或 AFTER ,以指明觸發器是在激活它的
語句之前或之後觸發。
trigger_event 指明了激活觸發器的語句的類型。trigger_event 可以是下述值之一:
INSERT:將新行插入表時激活觸發器,例如,通過 INSERT、LOADDATA 和 REPLACE 語句;
UPDATE:更改某一行時激活觸發器,例如,通過UPDATE語句;
DELETE:從表中刪除某一行時激活觸發器,例如,通過 DELETE 和 REPLACE 語句。

例如當我們向上面的user 表中增加一個用戶名為“welefen ”時,我們把記錄用戶數的表的值增
加 1;

代碼片段
Create table numuser(
Num int not null default 0
);

Delimiter //
Create trigger testnum after insert on welefen.user for each row
Begin
Update welefen.numuser set Num=Num+1;
End
//

視圖

當我們想得到數據表中某些字段的信息,並想把他們保存時我們就可以用視圖。

語法:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_Name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

例如我們想對上面的用戶表使用視圖,可以這樣:
Create viewwelefen.userview as select * fromwelefen.user;
查看視圖的信息可以使用:
Select * fromwelfen.userview;

mysql觸發器裡怎調用存儲過程

call showChildLst(new.pn,new.pa)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved