MySQL 存儲過程

MySQL 存儲過程

存儲過程是經過給定的語法格式編寫自定義的數據庫API,相似於給數據庫編寫可執行函數。html

簡介

存儲過程是一組爲了完成特定功能的SQL語句集合,是通過編譯後存儲在數據庫中。mysql

存儲過程加強了SQL語言的功能和靈活性,它能夠使用流控制語句編寫來完成複雜的判斷和計算。sql

存儲過程是把完成特定功能的SQL語句集合統一在數據庫中進行處理,避免了屢次網絡IO請求形成的網絡負載。shell

mysql> DELIMITER //
mysql> CREATE PROCEDURE proc1(OUT s int)
        -> BEGIN
        -> SELECT COUNT(*) INTO s FROM person;
        -> END //
mysql> DELIMITER;

基本語法

基本結構數據庫

DELIMITER //
DROP PROCEDURE IF EXISTS some_func;
CREATE PROCEDURE some_func
(
    IN param1 INT,
    IN param2 VARCHAR(32),
    OUT res INT
)
BEGIN
    SQL-SCRIPT
END //
DELIMITER;

調用語句以下,網絡

CALL some_func(params...);

變量函數

在存儲過程當中,函數參數包含三種變量,oop

  • IN 輸入參數,必須在調用存儲過程時指定
  • OUT 輸出參數,可在存儲過程內部被改變,返回該結果
  • INOUT 輸入輸出參數,調用時指定而且可被改變和返回

在存儲過程內部,參數的定義以下,ui

DECLARE var_name [, var_name] var_type [default value];

用戶變量code

SET @mvar = 'Hello World';

變量賦值

SET var_name = 表達式;

條件語句

if var=0 then 
  insert into person values ('f');
else
  insert into person values ('ff');
end if;

case語句

case var
when 0 then
  insert into person values ('f');
when 1 then
  insert into person values ('ff');
else
  insert into person values ('fff');
end case;

循環語句

WHILE語句,同C語言中的while語句同樣。

while var < N do
  insert into person values ('f');
  set var = var + 1;
end while;

REPEAT語句,相似於C語言中的do while語句。

repeat
  insert into person values ('f');
  set var = var + 1;
until var >= N
end repeat;

LOOP語句,沒有結束的判斷語句,利用leave來跳出循環,相似於break。

set @var = 0;
loop_name:loop
  set @var = @var + 1;
  if @var > 5 then
    leave loop_name;
  end if;
end loop loop_name;
select @var;

基本函數

mysql內置了一些函數,這些函數能夠極大地提升編寫存儲過程的效率。

字符串操做以下,

CHARSET(str) //獲取字符集
CONCAT(str1, str2, ...) //聯接字符串
INSTR(str, substr) //返回substr出如今str中的第一個位置
LOCATE(substr, str, start_position) //返回substr在str的start_position開始第一次出現的位置
LCASE(str) //將全部字符轉換爲小寫
LEFT(str, length) //返回str從左邊開始的length個字符
LENGTH(str) //返回str長度
LOAD_FILE(file_name) //讀取文見內容
LPAD(str, length, pad) //重複在str的首部插入pad,直到str的長度達到length
LTRIM(str) //去除str首部的空格
RTRIM(str) //去除str尾部的空格
STRCMP(str1, str2) //字符串比較
SUBSTRING(str, start_position, length) //截取字符串,默認第一個字符下標爲1

math相關操做以下,

ABS(i) //絕對值
BIN(i) //十進制->二進制
CEILING(i) //向上取整
CONV(i, from, to) //進制轉換
FLOOR(i) //向下取整
FORMAT(i, n) //保留小數位數
HEX(i) //轉十六進制
LEAST(i0, i1, i2, ..) //求最小值
MOD(i, demoninator) //求餘
POWER(I, POWER) //求指數
RAND([seed]) //隨機數
ROUND(I, [, DECIMALS]) //四捨五入,decimals爲保留小數位數
SQRT(number2) //開平方

時間相關操做以下,

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

參考

http://xdj651897373-126-com.iteye.com/blog/1819924 http://blog.tankywoo.com/2015/04/01/mysql-stored-procedure.html http://stackoverflow.com/questions/8549619/mysql-dynamically-build-query-string-in-a-stored-procedure-based-on-logic

相關文章
相關標籤/搜索