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

Mysql存儲過程-基本知識

編輯:MySQL綜合教程

Mysql存儲過程-基本知識   存儲過程如同一門程序設計語言,同樣包含了數據類型、流程控制、輸入和輸出和它自己的函數庫。    --------------------基本語法--------------------  一.創建存儲過程  create procedure sp_name()  begin  .........  end  二.調用存儲過程  1.基本語法:call sp_name()  注意:存儲過程名稱後面必須加括號,哪怕該存儲過程沒有參數傳遞  三.刪除存儲過程  1.基本語法:  drop procedure sp_name//  2.注意事項  (1)不能在一個存儲過程中刪除另一個存儲過程,只能調用另一個存儲過程  四.其他常用命令  1.show procedure status  顯示數據庫中所有存儲的存儲過程基本信息,包括所屬數據庫,存儲過程名稱,創建時間等  2.show create procedure sp_name  顯示某一個mysql存儲過程的詳細信息    --------------------數據類型及運算符--------------------  一、基本數據類型:  略  二、變量:  自定義變量:DECLARE   a INT ; SET a=100;    可用以下語句代替:DECLARE a INT DEFAULT 100;  變量分為用戶變量和系統變量,系統變量又分為會話和全局級變量  用戶變量:用戶變量名一般以@開頭,濫用用戶變量會導致程序難以理解及管理  1、 在mysql客戶端使用用戶變量  mysql> SELECT 'Hello World' into @x;  mysql> SELECT @x;  mysql> SET @y='Goodbye Cruel World';  mysql> select @y;  mysql> SET @z=1+2+3;  mysql> select @z;    2、 在存儲過程中使用用戶變量  mysql> CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');  mysql> SET @greeting='Hello';  mysql> CALL GreetWorld( );    3、 在存儲過程間傳遞全局范圍的用戶變量  mysql> CREATE PROCEDURE p1( )   SET @last_procedure='p1';  mysql> CREATE PROCEDURE p2( ) SELECT CONCAT('Last procedure was ',@last_procedure);  mysql> CALL p1( );  mysql> CALL p2( );    三、運算符:  1.算術運算符  +     加   SET var1=2+2;       4  -     減   SET var2=3-2;       1  *      乘   SET var3=3*2;       6  /     除   SET var4=10/3;      3.3333  DIV   整除 SET var5=10 DIV 3; 3  %     取模 SET var6=10%3 ;     1  2.比較運算符  >            大於 1>2 False  <            小於 2<1 False  <=           小於等於 2<=2 True  >=           大於等於 3>=2 True  BETWEEN      在兩值之間 5 BETWEEN 1 AND 10 True  NOT BETWEEN 不在兩值之間 5 NOT BETWEEN 1 AND 10 False  IN           在集合中 5 IN (1,2,3,4) False  NOT IN       不在集合中 5 NOT IN (1,2,3,4) True  =             等於 2=3 False  <>, !=       不等於 2<>3 False  <=>          嚴格比較兩個NULL值是否相等 NULL<=>NULL True  LIKE          簡單模式匹配 "Guy Harrison" LIKE "Guy%" True  REGEXP       正則式匹配 "Guy Harrison" REGEXP "[Gg]reg" False  IS NULL      為空 0 IS NULL False  IS NOT NULL 不為空 0 IS NOT NULL True  3.邏輯運算符  4.位運算符  |   或  &   與  << 左移位  >> 右移位  ~   非(單目運算,按位取反)  注釋:  mysql存儲過程可使用兩種風格的注釋  雙橫槓:--  該風格一般用於單行注釋  c風格:/* 注釋內容 */ 一般用於多行注釋  --------------------流程控制--------------------  一、順序結構  二、分支結構  if  case  三、循環結構  for循環  while循環  loop循環  repeat until循環  注:  區塊定義,常用  begin  ......  end;  也可以給區塊起別名,如:  lable:begin  ...........  end lable;  可以用leave lable;跳出區塊,執行區塊以後的代碼  begin和end如同C語言中的{ 和 }。  --------------------輸入和輸出--------------------  mysql存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN,OUT,INOUT  Create procedure|function([[IN |OUT |INOUT ] 參數名 數據類形...])  IN 輸入參數  表示該參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為默認值  OUT 輸出參數  該值可在存儲過程內部被改變,並可返回  INOUT 輸入輸出參數  調用時指定,並且可被改變和返回  IN參數例子:  CREATE PROCEDURE sp_demo_in_parameter(IN p_in INT)  BEGIN  SELECT p_in; --查詢輸入參數  SET p_in=2; --修改  select p_in;--查看修改後的值  END;  執行結果:  mysql> set @p_in=1  mysql> call sp_demo_in_parameter(@p_in)  略  mysql> select @p_in;  略  以上可以看出,p_in雖然在存儲過程中被修改,但並不影響@p_id的值  OUT參數例子  創建:  mysql> CREATE PROCEDURE sp_demo_out_parameter(OUT p_out INT)  BEGIN  SELECT p_out;/*查看輸出參數*/  SET p_out=2;/*修改參數值*/  SELECT p_out;/*看看有否變化*/  END;  執行結果:  mysql> SET @p_out=1  mysql> CALL sp_demo_out_parameter(@p_out)  略  mysql> SELECT @p_out;  略  INOUT參數例子:  mysql> CREATE PROCEDURE sp_demo_inout_parameter(INOUT p_inout INT)  BEGIN  SELECT p_inout;  SET p_inout=2;  SELECT p_inout;  END;  執行結果:  set @p_inout=1  call sp_demo_inout_parameter(@p_inout) //  略  select @p_inout;  略      附:函數庫  mysql存儲過程基本函數包括:字符串類型,數值類型,日期類型  一、字符串類  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  mysql> select substring(’abcd’,0,2);  +———————–+  | substring(’abcd’,0,2) |  +———————–+  |                       |  +———————–+  1 row in set (0.00 sec)  mysql> select substring(’abcd’,1,2);  +———————–+  | substring(’abcd’,1,2) |  +———————–+  | ab                    |  +———————–+  1 row in set (0.02 sec)  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為小數位數]  注:返回類型並非均為整數,如:  (1)默認變為整形值  mysql> select round(1.23);  +————-+  | round(1.23) |  +————-+  |           1 |  +————-+  1 row in set (0.00 sec)  mysql> select round(1.56);  +————-+  | round(1.56) |  +————-+  |           2 |  +————-+  1 row in set (0.00 sec)  (2)可以設定小數位數,返回浮點型數據  mysql> select round(1.567,2);  +—————-+  | round(1.567,2) |  +—————-+  |           1.57 |  +—————-+  1 row in set (0.00 sec)  SIGN (number2 ) //返回符號,正負或0  SQRT(number2) //開平方    三、日期類型  TO_DAYS()   #SELECT TO_DAYS( now( ) ) /365  結果是2014.8822  YEARWEEK()  #SELECT YEARWEEK( '2013-07-18' ) 結果是201328  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) //分  注:可用在INTERVAL中的類型:DAY ,DAY_HOUR ,DAY_MINUTE ,DAY_SECOND ,HOUR ,HOUR_MINUTE ,HOUR_SECOND ,MINUTE ,MINUTE_SECOND,MONTH ,SECOND ,YEAR  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 NUMERIC(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';     

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