--存儲過程(Stored Procedure)是在大型數據庫系統中,一組爲了完成特定功能的SQL語句集,
存儲在數據庫中,通過第一次編譯後再次調用不須要再次編譯,
用戶經過指定存儲過程的名字並給出參數(若是該存儲過程帶有參數)來執行它.
--觸發器是一種特殊類型的存儲過程
1、查詢、刪除、調用存儲過程
1.查看因此的存儲過程
--show procedure status;
2.查看某個存儲過程
--show create procedure "proc_name";
3.刪除存儲過程
--drop procedure proc_name;
--注:不能在一個存儲過程當中刪除另外一個存儲過程,只能調用另外一個存儲過程
4.調用存儲過程
-- exec proc_name [參數名]
-- Oracle 使用 call proc_name( param1, param2…);
2、建立存儲過程
-->基本語法:
create procedure sp_name
@[參數名] [類型],@[參數名] [類型]
as
begin
......sql_statement
end
--注意:存儲過程名字不能夠以阿拉伯數字開頭。
1. sp_name :存儲過程名不能超過128個字
2. 參數前面必須加@
-- 例1:
CREATE PROCEDURE proc1(IN parameter1 INT)
BEGIN
DECLARE variable1 CHAR(10);
IF parameter1 = 17 THEN
SET variable1 = 'birds';
ELSE
SET variable1 = 'beasts';
END IF;
INSERT INTO table1 VALUES (variable1);
END 前端
-->sql Server語法:
CREATE PROC [ EDURE ] procedure_name [ ;number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]
[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [ ...n ]mysql
1.procedure_name:存儲過程的名稱,在前面加 # 爲局部臨時存儲過程,加 ## 爲全局臨時存儲過程。
2.;number :是可選的整數,用來對同名的過程分組,
以便用一條 DROP PROCEDURE 語句便可將同組的過程一塊兒除去
3. @parameter: 存儲過程的參數,最多能夠有2100個參數,
參數只能代替常量,而不能用於代替表名、列名或其它數據庫對象的名稱.
4.data_type:參數的數據類型。cursor 數據類型只能用於 OUTPUT 參數。
5.VARYING: 指定做爲輸出參數支持的結果集(由存儲過程動態構造,內容能夠變化)。僅適用於遊標參數。
6.default:參數的默認值。若是定義了默認值,沒必要指定該參數的值便可執行過程。默認值必須是常量或 NULL。
若是過程將對該參數使用 LIKE 關鍵字,那麼默認值中能夠包含通配符(%、_、[] 和 [^])。
7.OUTPUT: 代表參數是返回參數。使用 OUTPUT 關鍵字的輸出參數能夠是遊標佔位符。
--IN 輸入參數
表示該參數的值必須在調用存儲過程時指定,在存儲過程當中修改該參數的值不能被返回,爲默認值
--OUT 輸出參數
該值可在存儲過程內部被改變,並可返回
--INOUT 輸入輸出參數
調用時指定,而且可被改變和返回
8.RECOMPILE: 代表 SQL Server 不會緩存該過程的計劃,該過程將在運行時從新編譯。
在使用非典型值或臨時值而不但願覆蓋緩存在內存中的執行計劃時,請使用 RECOMPILE 選項。
9.ENCRYPTION: 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 語句文本的條目。
10.FOR REPLICATION :指定不能在訂閱服務器上執行爲複製建立的存儲過程。
11.AS :指定過程要執行的操做。
12.sql_statement :過程當中要包含的任意數目和類型的 Transact-SQL 語句。sql
3、存儲過程的控制語句
1.條件語句
1) if-then -else語句
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; 數據庫
2) case語句
REATE 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; 後端
2.循環語句
1) while ···· end while
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; 緩存
2) repeat···· end repeat
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; 服務器
3) loop ·····end loop
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; 函數
4) 迭代:
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; oop
4、基本函數
一、字符串類
--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爲小數位數] --SQRT(number2) //開平方 3).日期時間類 --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