mysql函數和存儲過程
1、函數必須指定返回值,且參數默認為IN類型。
2、存儲過程沒返回值,參數可以是 IN,OUT,IN OUT類型,有的人可能會理解成OUT 也算是返回值。
3、調用方式:函數 select my_fun() ;過程 call my_pro( ) ;
4、DEMO
1
2
3
4
5
6
7
8
9
10
11
DELIMITER $$
DROP FUNCTION IF EXISTS my_fun$$
CREATE
FUNCTION my_fun(a INT(2),b INT(2))
RETURNS INT(4)
BEGIN
DECLARE sum_ INT(2) DEFAULT 0;
SET sum_ = a + b;
RETURN sum_;
END$$
DELIMITER ;
1
2
3
4
5
6
7
8
DELIMITER $$
DROP PROCEDURE IF EXISTS my_pro$$
CREATE
PROCEDURE my_pro(IN a INT(2),IN b INT(2) ,OUT c INT(2))
BEGIN
SET c = a + b;
END$$
DELIMITER ;
⑵ SQL SERVER 中存儲過程和函數的區別
一、多數指令是相同的,包括創建和修正存儲過程的指令。二、很多細微的指令有不同,具體如下(不僅):1mysql支持enum,和set類型,sqlserver不支持2mysql不支持nchar,nvarchar,ntext類型3mysql的遞增語句是AUTO_INCREMENT,而mssql是identity(1,1)MYSQL:createtablebasic(idintkeyauto_increment,namevarchar(20));MSSQL:createtablebasic(idintidentity(1,1),namevarchar(20))4msms默認到處表創建語句的默認值表示是((0)),而在mysql裡面是不允許帶兩括弧的5mysql需要為表指定存儲類型6mssql識別符是[],[type]表示他區別於關鍵字(可選用來包含表名、欄位名),但是mysql卻是`(重音符,也就是按鍵1左邊的那個符號)7mssql支持getdate()方法獲取當前時間日期,但是mysql裡面可以分日期類型和時間類型,獲取當前日期是cur_date(),當前完整時間是now()函數8mssql不支持replaceinto語句,但是在最新的sql20008裡面,也支持merge語法9mysql支持insertintotable1sett1=『』,t2=『』,但是mssql不支持這樣寫10mysql插入多行支持這樣寫insertintotabl1values(1,1),(1,1),(1,1),(1,1),(1,1),(1,1),(1,1)MSSQL不支持11mssql不支持limit語句,是非常遺憾的,只能用top取代limt0,N,row_number()over()函數取代limitN,M12mysql在創建表時要為每個表指定一個存儲引擎類型,而mssql只支持一種存儲引擎13mysql不支持默認值為當前時間的datetime類型(mssql很容易做到),在mysql裡面是用timestamp類型14mssql裡面檢查是否有這個表再刪除,需要這樣:ifexists(select*fromdbo.sysobjectswhereid=object_id(N'uc_newpm')andOBJECTPROPERTY(id,N'IsUserTable')=1)但是在mysql裡面只需要DROPTABLEIFEXISTScdb_forums;15mysql支持無符號型的整數,那麼比不支持無符號型的mssql就能多出一倍的最大數存儲16mysql不支持在mssql裡面使用非常方便的varchar(max)類型,這個類型在mssql裡面既可做一般數據存儲,也可以做blob數據存儲17mysql創建非聚集索引只需要在創建表的時候指定為key就行,比如:KEYdisplayorder(fid,displayorder)在mssql裡面必須要:_uc_protectedmembers_username_appidondbo.uc_protectedmembers(usernameasc,appidasc)18mysqltext欄位類型不允許有默認值19mysql的一個表的總共欄位長度不超過65XXX。20一個很表面的區別就是mysql的安裝特別簡單,而且文件大小才110M(非安裝版),相比微軟這個龐然大物,安裝進度來說簡直就是..21mysql的管理工具有幾個比較好的,mysql_front,和官方那個套件,不過都沒有SSMS的使用方便,這是mysql很大的一個缺點。22mysql的存儲過程只是出現在最新的版本中,穩定性和性能可能不如mssql。23同樣的負載壓力,mysql要消耗更少的CPU和內存,mssql的確是很耗資源。24php連接mysql和mssql的方式都差不多,只需要將函數的mysql替換成mssql即可。25mysql支持date,time,year類型,mssql到2008才支持date和time。26變數賦值MYsql:變數賦值SELECT@min_price:=MIN(price),@max_price:=MAX(price)FROMshopMSsql:變數賦值SELECT@min_price=MIN(price),@max_price=MAX(price)FROMshop三、總的來說,如果是簡單的存儲過程代碼,要修改,不會太難。如果是復雜的系統,要移植會很難很難。
⑶ mysql 存儲過程怎麼調用
php調用mysql存儲過程和函數的方法
存儲過程和函數是MySql5.0剛剛引入的。關於這方面的操作在PHP裡面沒有直接的支持。但是由於Mysql PHP API的設計,使得我們可以在以前的PHP版本中的mysql php api中支持存儲過程和函數的調用。
在php中調用存儲過程和函數。
1。調用存儲過程的方法。
a。如果存儲過程有 IN/INOUT參數,聲明一個變數,輸入參數給存儲過程,該變數是一對,
一個php變數(也可以不必,只是沒有php變數時,沒有辦法進行動態輸入),一個Mysql
變數。
b。如果存儲過程有OUT變數,聲明一個Mysql變數。
mysql變數的聲明比較特殊,必須讓mysql伺服器知道此變數的存在,其實也就是執行一條mysql語句。
入set @mysqlvar=$phpvar ;
c。使用mysql_query()/mysql_db_query()執行mysql 變數聲明語句。
mysql_query("set @mysqlvar=$pbpvar");
這樣,在mysql伺服器裡面就有一個變數,@mysqlar。如果是IN參數,那麼其值可以由phpar傳入。
d。 如果是存儲過程。
1。執行 call procere()語句。
也就是mysql_query("call proceer([var1]...)");
2. 如果有返回值,執行select @ar,返回執行結果。
mysql_query("select @var)"
接下來的操作就和php執行一般的mysql語句一樣了。可以通過mydql_fetch_row()等函數獲得結果。
如果時函數。 直接執行 select function() 就可以了。
$host="localhost";
$user="root";
$password="11212";
$db="samp_db";
$dblink=mysql_connect($host,$user,$password)
or die("can't connect to mysql");
mysql_select_db($db,$dblink)
or die("can't select samp_db");
$res=mysql_query("set @a=$password",$dblink);
$res=mysql_query("call aa(@a)",$dblink);
$res=mysql_query("select @a",$dblink);
$row=mysql_fetch_row($res);
echo $row[0];
⑷ 五、MYSQL存儲過程和函數
• create procere用來創建 存儲過程 ,create function用來創建 函數
• Delimiter命令是改變語句的結束符 ,MySQL默認的結束符為;號,由於procere和function中的;號並不代表創建的結束,所以要替換成另外的結束符以便表示創建的結束
• rontine_body子句可以包含一個簡單的SQL語句,也可以包含多個SQL語句, 通過begin…end將這多個SQL語句 包含在一起
• MySQL存儲過程和函數中也可以包含類似create和drop等DDL語句
• comment子句用來寫入對存儲過程和函數的注釋
• Language子句用來表示此存儲過程和函數的創建語言
• 存儲過程和函數被標注為deterministic表明當輸入相同的參數是會返回相同的結果,反之如果是not deterministic則表示相同參數不會是相同結果,默認是not deterministic
• 相關屬性短語只有咨詢含義,並不是強制性的約束
• Drop procere/function語句用來 刪除指定名稱的存儲過程或函數
• Begin…end語句通常出現在存儲過程、函數和觸發器中,其中 可以包含一個或多個語句 ,每個語句用;號隔開
• 標簽label可以加在begin…end語句以及loop, repeat和while語句
• 語句中通過iterate和leave來控制流程,iterate表示返回指定標簽位置,leave表示跳出標簽
• Declare語句通常用來聲明本地變數、游標、條件或者handler
• Declare語句只允許出現在begin … end語句中而且必須出現在第一行
• Declare的順序也有要求,通常是先聲明本地變數,再是游標,然後是條件和handler
• 本地變數可以通過declare語句進行聲明
• 聲明後的變數可以通過select … into var_list進行賦值,或者通過set語句賦值,或者通過定義游標並使用fetch … into var_list賦值
• 通過declare聲明變數方法:
• MySQL支持if,case,iterate,leave,loop,while,repeat語句作為存儲過程和函數中的 流程式控制制語句 ,另外return語句也是函數中的特定流程式控制制語句
• Case語句在存儲過程或函數中表明了 復雜的條件選擇語句
• IF語句在存儲過程或函數中表明了 基礎的條件選擇語句
其中在 function 裡面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我們開啟了 bin-log, 我們就必須為我們的 function 指定一個參數。
在 MySQL 中創建函數時出現這種錯誤的解決方法:
set global log_bin_trust_function_creators=TRUE;
• Iterate語句 僅出現在loop,repeat,while循環語句中,其含義表示重新開始此循環
• Leave語句表明 退出指定標簽的流程式控制制語句塊
• 通常會用在begin…end,以及loop,repeat,while的循環語句中
• Loop語句是存儲過程或函數中表達 循環執行 的一種方式
• repeat語句是存儲過程或函數中表達 循環執行 的一種方式
• while語句是存儲過程或函數中表達 循環執行 的一種方式
• Return語句用在 函數中,用來終結函數的執行並將指定值返回給調用者
• Cursor游標用來 聲明一個數據集
• 游標的聲明必須在變數和條件聲明之後,在handler聲明之前
• Cursor close語句用來 關閉之前打開的游標
• Cursor declare語句用來聲明一個游標和指定游標對應的數據集合, 通常數據集合是一個select語句
• Cursor fetch語句用來獲取游標指定數據集的 下一行數據 並將各個欄位值賦予後面的變數
• Open cursor語句用來打開一個之前已經 聲明好的游標
• Declare condition語句命名 特定的錯誤條件 ,而該特定錯誤可以在declare…handler中指定 處理方法
• 比如在MySQL中1051error code表示的是unknown table的錯誤,如果要對這
個錯誤做特殊處理,可以用三種方法:
• Declare handler語句用來聲明一個handler來處理一個或多個特殊條件,當其中的某個條件滿足時則觸發其中的statement語句執行
• Statement可以是一個簡單SQL語句,也可以是begin…end組成的多個語句
• Handler_action子句聲明當執行完statement語句之後應該怎麼辦
Condition_value的值有以下幾種:
• 當condition發生但沒有聲明handler時,則存儲過程和函數依照如下規則處理
• create trigger語句用來創建一個觸發器,觸發器的作用是當表上有對應SQL語句發生時,則觸發執行
• 觸發器創建時需要 指定對應的表名 tbl_name
• Definer關鍵詞用來指定trigger的安全環境
• Trigger_time指定觸發器的執行時間,BEFORE和AFTER指定觸發器在表中的 每行數據修改前或者後 執行
• Trigger_event指定觸發該觸發器的具體 事件
• INSERT當新的一行數據插入表中時觸發,比如通過執行insert,load data,replace語句插入新數據
• UPDATE當表的一行數據被修改時觸發,比如執行update語句時
• DELETE當表的一行數據被刪除時觸發,比如執行delete,replace語句時
• 當執行insert into … on plicate key update語句時,當碰到重復行執行update時,則觸發update下的觸發器
• 從5.7.2版本開始,可以創建具有相同trigger_time和trigger_event的同一個表上的多個觸發器,默認情況下按照創建的時間依次執行,通過 指定FOLLOWS/PRECEDES改變執行順序 ,即FOLLOWS時表示新創建的觸發器後執行,PRECEDES則表示新觸發器先執行
• Trigger_body表示觸發器觸發之後要執行的一個或多個語句,在內部可以引用涉及表的欄位, OLD.col_name表示行數據被修改或刪除之前的欄位數據,NEW.col_name表示行數據被插入或修改之後的欄位數據
• Drop trigger語句用來 刪除一個觸發器
• If exists短語用來避免刪除不存在的觸發器時引發報錯
• 當你執行drop table時,表上的觸發器也被drop掉了
⑸ MySQL的存儲過程和存儲函數(UDF)的區別
2、存儲過程沒返回值,參數可以是 IN,OUT,IN OUT類型,有的人可能會理解成OUT 也算是返回值。
3、調用方式:函數 select my_fun() ;過程 call my_pro( ) ;
4、DEMO
1
2
3
4
5
6
7
8
9
10
11
DELIMITER $$
DROP FUNCTION IF EXISTS my_fun$$
CREATE
FUNCTION my_fun(a INT(2),b INT(2))
RETURNS INT(4)
BEGIN
DECLARE sum_ INT(2) DEFAULT 0;
SET sum_ = a + b;
RETURN sum_;
END$$
DELIMITER ;
1
2
3
4
5
6
7
8
DELIMITER $$
DROP PROCEDURE IF EXISTS my_pro$$
CREATE
PROCEDURE my_pro(IN a INT(2),IN b INT(2) ,OUT c INT(2))
BEGIN
SET c = a + b;
END$$
DELIMITER ;
5、調用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> call my_pro(1,2,@c);
Query OK, 0 rows affected (0.00 sec)
mysql> select @c;
+------+
| @c |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
mysql> select my_fun(1,2);
+-------------+
| my_fun(1,2) |
+-------------+
| 3 |
+-------------+
1 row in set (0.00 sec)
⑹ mysql 查詢資料庫中的存儲過程與函數的語句
方法一:
select
`name`
from
mysql.proc
where
db
=
'your_db_name'
and
`type`
=
'PROCEDURE'
//存儲過程
select
`name`
from
mysql.proc
where
db
=
'your_db_name'
and
`type`
=
'FUNCTION'
//函數
方法二:
show
procere
status;
//存儲過程
SHOW
PROCEDURE
STATUS
WHERE
db='servant_591up'
show
function
status;
//函數
查看存儲過程或函數的創建代碼
show
create
procere
proc_name;
show
create
function
func_name;
查看視圖
SELECT
*
from
information_schema.VIEWS
//視圖
SELECT
*
from
information_schema.TABLES
//表
查看觸發器
方法一:
語法:SHOW
TRIGGERS
[FROM
db_name]
[LIKE
expr]
實例:SHOW
TRIGGERS\G
//觸發器
方法二:
對INFORMATION_SCHEMA資料庫中的TRIGGERS表查詢
mysql>SELECT
*
FROM
triggers
T
WHERE
trigger_name=」mytrigger」
\G
⑺ mysql存儲過程的基本用法有哪些
mysql存儲過程的基本用法有哪些
在外部程序訪問資料庫時(例如 PHP),要組織很多 SQL 語句。
特別是業務邏輯復雜的時候,一大堆的 SQL 和條件夾雜在 PHP 代碼中,讓人不寒而慄。現在有了 MySQL 存儲過程,業務邏輯可以封裝存儲過程中,這樣不僅容易維護,而且執行效率也高。
一、MySQL 創建存儲過程
"pr_add" 是個簡單的 MySQL 存儲過程,這個MySQL 存儲過程有兩個 int 類型的輸入參數 "a"、"b",返回這兩個參數的和。
復制代碼 代碼如下:
drop procere if exists pr_add;
計算兩個數之和
復制代碼 代碼如下:
create procere pr_add
(
a int,
b int
)
begin
declare c int;
if a is null then
set a = 0;
end if;
if b is null then
set b = 0;
end if;
set c = a + b;
select c as sum;
/*
return c;
不能在 MySQL 存儲過程中使用。return 只能出現在函數中。
*/
end;
二、調用 MySQL 存儲過程
復制代碼 代碼如下:
call pr_add(10, 20);
執行 MySQL 存儲過程,存儲過程參數為 MySQL 用戶變數。
復制代碼 代碼如下:
set @a = 10;
set @b = 20;
call pr_add(@a, @b);
三、MySQL 存儲過程特點
創建 MySQL 存儲過程的簡單語法為:
復制代碼 代碼如下:
create procere 存儲過程名字()
(
[in|out|inout] 參數 datatype
)
begin
MySQL 語句;
end;
MySQL 存儲過程參數如果不顯式指定"in"、"out"、"inout",則默認為"in"。習慣上,對於是"in" 的參數,我們都不會顯式指定。
1. MySQL 存儲過程名字後面的"()"是必須的,即使沒有一個參數,也需要"()"
2. MySQL 存儲過程參數,不能在參數名稱前加"@",如:"@a int"。下面的創建存儲過程語法在 MySQL 中是錯誤的(在 SQL Server 中是正確的)。 MySQL 存儲過程中的變數,不需要在變數名字前加"@",雖然 MySQL 客戶端用戶變數要加個"@"。
復制代碼 代碼如下:
create procere pr_add
(
@a int, -- 錯誤
b int -- 正確
)
3. MySQL 存儲過程的參數不能指定默認值。
4. MySQL 存儲過程不需要在 procere body 前面加 "as"。而 SQL Server 存儲過程必須加 "as" 關鍵字。
復制代碼 代碼如下:
create procere pr_add
(
a int,
b int
)
as -- 錯誤,MySQL 不需要 "as"
begin
mysql statement ...;
end;
5. 如果 MySQL 存儲過程中包含多條 MySQL 語句,則需要 begin end 關鍵字。
復制代碼 代碼如下:
create procere pr_add
(
a int,
b int
)
begin
mysql statement 1 ...;
mysql statement 2 ...;
end;
6. MySQL 存儲過程中的每條語句的末尾,都要加上分號 ";"
復制代碼 代碼如下:
...
declare c int;
if a is null then
set a = 0;
end if;
...
end;
7. MySQL 存儲過程中的注釋。
復制代碼 代碼如下:
/*
這是個
多行 MySQL 注釋。
*/
declare c int; -- 這是單行 MySQL 注釋 (注意 -- 後至少要有一個空格)
if a is null then # 這也是個單行 MySQL 注釋
set a = 0;
end if;
⑻ mysql為四個表創建儲存過程或者儲存函數
「另一個存儲過程」的名字是sp1,沒有參數,返回的結果集共3列,全部為int型,那麼「存儲過程」里添加一個與結果集列數相同的臨時表或表變數用於接收「另一個存儲過程」的結果集
如下
CREATE
PROCEDURE
sp2
AS
DECLARE
@t
table(a
int,b
int,c
int)
INSERT
INTO
@t(a,b,c)
EXEC
sp1
SELECT
*
FROM
@t
使用SQLSERVER存儲過程可以很大的提高程序運行速度,簡化編程維護難度,現已得到廣泛應用。
創建存儲過程
和數據表一樣,在使用之前需要創建存儲過程,它的簡明語法是:
引用:
Create
PROC
存儲過程名稱
[參數列表(多個以「,」分隔)]
AS
SQL
語句
例:
引用:
Create
PROC
upGetUserName
@intUserId
INT,
@ostrUserName
NVARCHAR(20)
OUTPUT
--
要輸出的參數
AS
BEGIN
--
將uName的值賦給
@ostrUserName
變數,即要輸出的參數
Select
@ostrUserName=uName
FROM
uUser
Where
uId=@intUserId
END
其中
Create
PROC
語句(完整語句為Create
PROCEDURE)的意思就是告訴SQL
SERVER,現在需要建立一個存儲過程,upGetUserName
就是存儲過程名稱,@intUserId
和
@ostrUserName
分別是該存儲過程的兩個參數,注意,在SQL
SERVER中,所有用戶定義的變數都以「@」開頭,OUTPUT關鍵字表示這個參數是用來輸出的,AS之後就是存儲過程內容了。只要將以上代碼在「查詢分析器」里執行一次,SQL
SERVER就會在當前資料庫中創建一個名為「upGetUserName」的存儲過程。你可以打開「企業管理器」,選擇當前操作的資料庫,然後在左邊的樹型列表中選擇「存儲過程」,此時就可以在右邊的列表中看到你剛剛創建的存儲過程了(如果沒有,刷新一下即可)。