c調用mysql存儲過程
mysql> delimiter //
這個作用是把;變成//,以後的語句遇到//就結束了,遇到;不結束,下面就可以按你的想法寫了
mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
-> BEGIN
-> SELECT COUNT(*) INTO param1 FROM t;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ; 這里把雙引號改回來
聲明參數要在說明是 輸入還是輸出函數 in\out
給函數變數賦值用
set @a=10;
例子:
drop procere if exists pr_param_in;
create procere pr_param_in
(
in id int -- in 類型的 MySQL 存儲過程參數
)
begin
if (id is not null) then
set id = id + 1;
end if;
select id as id_inner;
end;
set @id = 10;
call pr_param_in(@id);
select @id as id_out;
mysql> call pr_param_in(@id);
❷ 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編寫一個存儲過程
1、delimiter // ,聲明分隔符:DELIMITER是分割符的意思,因為MySQL默認以";"為分隔符,如果我們沒有聲明分割符,那麼編譯器會把存儲過程當成SQL語句進行處理,則存儲過程的編譯過程會報錯,所以要事先用DELIMITER關鍵字申明當前段分隔符,這樣MySQL才會將";"當做存儲過程中的代碼,不會執行這些代碼(這里如果不懂的話,你可以通過試錯的方法來理解)。
2、編寫存儲過程的格式:CREATE PROCEDURE([[IN |OUT |INOUT ]參數名數據類形...])
例子:
1)create procere proc1(out s int) // 只有輸出
2)create procere proc2(in p_in bigint) // 只有輸入
3)create procere proc15() // 沒有輸入與輸出
4)create procere demo_multi_param(in id bigint,in name varchar(32),out c int) //多輸入與輸出
3、過程體的開始與結束使用BEGIN與END進行標識。
4、select count (*) into s from student; // 過程體,一系列的邏輯語句,sql語句
5、delimiter ; 用完了之後要把分隔符還原。
❹ mysql 存儲過程
你應該在做統計吧,估計你不會的就是mysql存儲過程的語法 我之前也寫過 很是郁悶 我給你一段代碼 是我用mysql寫過的一個存儲過程 你看看 主要是了解裡面的語法 看懂了 你所說的需求並不難
有看不懂的地方一起討論 :
begin
declare tikk datetime ;
declare done int default 0;
declare userid int default 0;
declare moleid int default 0;
declare couid int default 0;
declare mname varchar(255) ;
declare opsid int default 0;
declare c1 cursor for Select I_userID,I_operationID from space_operation_record where status<>0 group by I_userID,I_operationID order by createtime desc;
declare continue handler for sqlstate '02000' set done =1;
set tikk = now();
open c1;
repeat
fetch c1 into userid, opsid;
if not done then
select I_moleID from space_operation where status<>0 and ID=opsid into moleid;
if moleid <> '' then
select Nvc_identification from space_operation where status<>0 and ID=opsid into @identiftion;
if moleid > 0 then
Select Nvc_ename from space_mole where status<>0 and ID=moleid into mname;
else
set mname = 'space';
end if;
create temporary table if not exists sp_tab1(id bigint(20),Nvc_content MEDIUMTEXT,I_obyuID bigint(20),I_tID bigint(20),createtime datetime);
INSERT INTO sp_tab1 Select ID,Nvc_content,I_objectID,I_tmID,createtime from space_operation_record where status<>0 and I_operationID=opsid and I_userID=userid ;
select count(*) from sp_tab1 into couid;
set @ihod = 0;
set @listp = '';
set @listpp = '';
set @content0p = '';
set @content0 = '';
while couid > 0 do
select ID,Nvc_content,I_obyuID,createtime,I_tID into @iok,@conuiy,@objiplk,@crtimhr,@tmids from sp_tab1 where ID > @ihod order by ID asc limit 0,1;
if @iok <> '' then
if mname = 'blog' then
INSERT INTO space_operation_stat(I_operationID,I_userID,Nvc_content,D_stattime,createtime) VALUES (@iok,userid,@conuiy,@crtimhr,tikk);
elseif mname = 'team' then
if(@identiftion = 'addblog' || @identiftion = 'mdyblog') then
INSERT INTO space_operation_stat(I_operationID,I_userID,Nvc_content,D_stattime,I_tmID,createtime) VALUES (@iok,userid,@conuiy,@crtimhr,@tmids,tikk);
else
set @listpp = CONCAT(@listpp,CONCAT(@objiplk,','));
set @operarry1p = substring_index(@conuiy,'|',1);
set @operarry2p = substring_index(@conuiy,'|',-1);
set @content0p = CONCAT(@content0p,CONCAT(@operarry2p,SPACE(1)));
set @objlistp = substring(@listpp,1,length(@listpp)-1);
end if;
elseif mname = 'space' then
if(@identiftion = 'headphoto' || @identiftion = 'status') then
INSERT INTO space_operation_stat(I_operationID,I_userID,Nvc_content,D_stattime,I_tmID,createtime) VALUES (@iok,userid,@conuiy,@crtimhr,@tmids,tikk);
else
set @listppr = CONCAT(@listppr,CONCAT(@objiplk,','));
set @operarry1pr = substring_index(@conuiy,'|',1);
set @operarry2pr = substring_index(@conuiy,'|',-1);
set @content0pr = CONCAT(@content0pr,CONCAT(@operarry2pr,SPACE(1)));
set @objlistpr = substring(@listppr,1,length(@listppr)-1);
end if;
else
set @listp = CONCAT(@listp,CONCAT(@objiplk,','));
set @operarry1 = substring_index(@conuiy,'|',1);
set @operarry2 = substring_index(@conuiy,'|',-1);
set @content0 = CONCAT(@content0,CONCAT(@operarry2,SPACE(1)));
set @objlist = substring(@listp,1,length(@listp)-1);
end if;
set @ihod = @iok;
end if;
set couid = couid -1;
end while;
if @content0 <> '' then
set @contentp = CONCAT(@operarry1,concat('|',@content0));
Select createtime,ID into @uitimej,@IDjok from space_operation_record where status<>0 and I_operationID=opsid order by createtime desc limit 0,1;
if @uitimej <> '' then
INSERT INTO space_operation_stat(I_operationID,I_userID,Nvc_content,D_stattime,createtime,Nvc_objlist) VALUES(@iok,userid,@contentp,@crtimhr,tikk,@objlist);
end if;
end if;
if @content0p <> '' then
if @identiftion = 'addphoto' then
set @contentp = CONCAT(@operarry1p,CONCAT('|',@content0p));
else
set @contentp = CONCAT(@operarry1p,CONCAT(@content0p,'|'));
end if;
Select createtime,ID into @uitimej,@IDjok from space_operation_record where status<>0 and I_operationID=opsid order by createtime desc limit 0,1;
if @uitimej <> '' then
INSERT INTO space_operation_stat(I_operationID,I_userID,Nvc_content,D_stattime,createtime,Nvc_objlist,I_tmID) VALUES(@iok,userid,@contentp,@crtimhr,tikk,@objlistp,@tmids);
end if;
end if;
if @content0pr <> '' then
set @contentp = CONCAT(@operarry1p,concat('|',@content0pr));
Select createtime,ID into @uitimej,@IDjok from space_operation_record where status<>0 and I_operationID=opsid order by createtime desc limit 0,1;
if @uitimej <> '' then
INSERT INTO space_operation_stat(I_operationID,I_userID,Nvc_content,D_stattime,createtime,Nvc_objlist,I_tmID) VALUES(@iok,userid,@contentp,@crtimhr,tikk,@objlistp,@tmids);
end if;
end if;
delete from sp_tab1;
end if;
end if;
until done end repeat;
close c1;
drop temporary table if exists sp_tab1 ;
UPDATE space_operation_play SET status=0;
UPDATE space_operation_display SET status=0;
Select createtime into @ptimes from space_operation_stat where status<>0 order by createtime desc limit 0,1;
if @ptimes <>'' then
create temporary table if not exists sp_tab2(id bigint(20),Nvc_content MEDIUMTEXT,I_userID bigint(20),I_lyuID bigint(20),D_stattime datetime);
INSERT INTO sp_tab2 Select ID,Nvc_content,I_userID,I_tmID,D_stattime from space_operation_stat where status<>0 and createtime=@ptimes order by D_stattime desc limit 0,30;
select count(*) from sp_tab2 into @cou1id;
set @uoj = 0;
while @cou1id > 0 do
select ID,Nvc_content,I_userID,D_stattime,I_lyuID into @io1k,@conui1y,@objipl1k,@crtimh1r,@unlpa from sp_tab2 where ID > @uoj order by ID asc limit 0,1;
if @io1k <> '' then
INSERT INTO space_operation_play(I_statID,Nvc_content,D_stattime,I_userID,Createtime,I_tmID) VALUES (@io1k,@conui1y,@crtimh1r,@objipl1k,now(),@unlpa);
set @uoj = @io1k;
end if;
set @cou1id = @cou1id -1;
end while;
drop temporary table if exists sp_tab2 ;
end if;
end
❺ mysql存儲過程
存儲過程在mysql中是新面孔,最近一直在用存儲過程,但忘記了一個很重要的問題,如何得到存儲過程的列表。
可能是對mysql太有信心了,一開始我沒考慮過這個問題,直到我建立了55個存儲過程後,才意識到問題的嚴重性,我無法用類似show tables獲得表的列表一樣用show PROCEDURES 來獲得存儲過程的列表。我試了show stored routines 、show storedroutines 、show routines等等,結果都在意料之中,得不到。
接著我想到了information_schema庫,在以前,select * from information_schema.tables;是比show tables還要方便得到表信息的辦法,於是我去了information_schema庫中轉了一圈,仍然一無所獲。而完全沒有去想一直用來保存用戶和地址信息的mysql庫。
就在今天為了建立可以調用存儲過程的用戶時,我訪問了mysql庫,在剛進的時候察覺了庫中多了幾個表,也沒在意,在要離開的時候才注意到裡面有一個表的名字叫proc,似乎是建立存儲過程時使用的PROCEDURES前4位字母,於是select了一下,結果掘到了寶。存儲過程的相關數據好好的保存在裡面。看來以後也同樣不能小看mysql庫了。
想要得到你的存儲過程列表,那麼執行下面的語句吧。
select name,db from mysql.proc;
ps:還得知了存儲過程的名稱長度為64個位元組,多於64則自動刪除。可以使用中文-_-!!!
❻ mysql調用存儲過程刪除數據
創建:
delimiter //
create procere my_add(IN a int, IN b int, OUT c int)
begin
if a is null then set a = 0;
end if;
if b is null then set b = 0;
end if;
set c = a + b;
end;
//
delimiter ;
查看:
方法一:(直接查詢,比較實用,查看當前自定義的存儲過程)
select `specific_name` from mysql.proc where `db` = 'your_db_name' and `type` = 'procere'
方法二:(查看資料庫里所有存儲過程+內容)
show procere status;
方法三:(查看當前資料庫里存儲過程列表)
select specific_name from mysql.proc ;
方法四:(查看某一個存儲過程的具體內容)
select body from mysql.proc where specific_name = 'your_proc_name';
查看存儲過程或函數的創建代碼 :
show create procere your_proc_name;
show create function your_func_name;
調用:
mysql> set @a = 10;
Query OK, 0 rows affected (0.00 sec)
mysql> set @b = 20;
Query OK, 0 rows affected (0.00 sec)
mysql> set @c = 0;
Query OK, 0 rows affected (0.00 sec)
mysql>select @c;
+------+
| @c |
+------+
| 0 |
+------+
mysql> call my_add(@a, @b, @c);
Query OK, 0 rows affected (0.00 sec)
mysql> select @a, @b, @c;
+------+------+------+
| @a | @b | @c |
+------+------+------+
| 10 | 20 | 30 |
+------+------+------+
1 row in set (0.00 sec)
刪除
drop procere your_proc_name;
❼ MySQL裡面sql語句調用存儲過程,該如何寫
這樣:
CREATEPROCEDUREsp_add(a int, b int,outc int)
begin
set c=a+ b;
end;
調用過程:
call sp_add (1,2,@a);
select @a;
(7)c調用mysql存儲過程擴展閱讀:
注意事項
存儲過程(stored procere)是一組為了完成特定功能的SQL語句集合,經編譯後存儲在伺服器端的資料庫中,利用存儲過程可以加速SQL語句的執行。
存儲過程分為系統存儲過程和自定義存儲過程。
系統存儲過程在master資料庫中,但是在其他的資料庫中可以直接調用,並且在調用時不必在存儲過程前加上資料庫名,因為在創建一個新資料庫時,系統存儲過程在新的資料庫中會自動創建。
自定義存儲過程,由用戶創建並能完成某一特定功能的存儲過程,存儲過程既可以有參數又有返回值,但是它與函數不同,存儲過程的返回值只是指明執行是否成功,並不能像函數那樣被直接調用,只能利用execute來執行存儲過程。
創建存儲過程
SQL Server創建存儲過程:
create procere 過程名
@parameter 參數類型
@parameter 參數類型
。。。
as
begin
end
執行存儲過程:execute 過程名
❽ mysql 怎麼執行帶有參數的存儲過程
直接用call調用存儲過程,如:call getUserInfo(參數1,參數2...);