mysql存儲過程fetch
你應該在做統計吧,估計你不會的就是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存儲過程,並用php調用它
mysql創建的存儲,在mysql里執行就可以
create procere pr_user_get(
p_user_id int -- 傳入的參數
)
proc_start:begin
select b.*
from table1 as a,table2 as b
where a.userid = p_user_id
and a.username = b.username;
end proc_start
php調用
$sql = "call pr_user_get('$userid')";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
$row 就是了
Ⅲ php調用mysql存儲過程,如何實現。 我的代碼如下:
mysql存儲過程返回2個資源,第一個是執行信息,第二個是存儲過程返回結果。
mysql_*系列函數無法獲取超過1個資源,需使用mysqli或PDO代替。
PDO:
$stmt=$db->prepare("CALLpro_rb_save(?,?,@return_msg);");
$stmt->bindParam(1,$a);
$stmt->bindParam(2,$b);
$stmt->execute();
$outputArray=$db->query("select@return_msg")->fetch(PDO::FETCH_ASSOC);
var_export($return_msg);
Ⅳ mysql中的存儲過程、觸發器、視圖的用法
建立存儲過程
Create procere、Create function
下面是它們的格式:
Create proceresp_Name ([proc_parameter ])
routine_body
這里的參數類型可以是 IN OUT INOUTT ,意思和單詞的意思是一樣的,IN 表示是傳進來的參數,
OUT 是表示傳出去的參數,INOUT 是表示傳進來但最終傳回的參數。
Create functionsp_Name ([func_parameter ])
Returns type
Routine_body
Returns type 指定了返回的類型,這里給定的類型與返回值的類型要是一樣的,否則會報錯。
下面給出兩個簡單的例子來說明:
1、 顯示 Mysql 當前版本
執行結果
mysql> use welefen;
Database changed
mysql> delimiter // #定義//作為結束標記符號
mysql> create procere getversion(out param1 varchar(50)) #param1為傳出參數
-> begin
-> select version() into param1; #將版本的信息賦值給 param1
-> end
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> call getversion(@a); #調用getversion()這個存儲過程
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> select @a;
-> //
+--------------------------+
| @a |
+--------------------------+
| 5.1.14-beta-community-nt |
+--------------------------+
1 row in set (0.00 sec)
2、 顯示」hello world」
執行結果
mysql> delimiter //
mysql> create function display(w varchar(20)) returns varchar(50)
-> begin
-> return concat('hello 『,w);
-> end
-> //
Query OK, 0 rows affected (0.05 sec)
mysql> select display("world");
-> //
+------------------+
| display("world") |
+------------------+
| hello world |
+------------------+
1 row in set (0.02 sec)
其他操作存儲過程的語句
前面我們已經知道了怎麼創建存儲過程,下面看看其他常用的用於操作存儲過程的語句。
Alter {procere | function} sp_Name []
Alter 語法是用來改變一個過程或函數的特徵,當你想改變存儲過程或者函數的結構時可以使
用它。當然你也可以先 drop 它再 create。
Drop {procere | function} [if exists] sp_Name
Drop 語法即用來刪除一個存儲程序或者函數,當你創建的一個存儲過程或者函數的名字已經存
在時,你想把以前的給覆蓋掉,那麼此時你就可以使用 drop ,然後在創建。
Show create {procere | function } sp_Name
Show 語法用來顯示創建的存儲過程或者函數的信息。這里的 show 用法跟數據表中的 show 用
法是很相似的。
Show {procere | function} status [like 'partten']
它返回子程序的特徵,如資料庫,名字,類型,創建者及創建和修改日期。如果沒有指定樣式,
根據你使用的語句,所有存儲程序和存儲函數的信息都被列出。
看了以上的幾個語法,你是不是感覺跟對表的操作很相象,那你就想對了,他們確實是很相似
的。帶著一份激動心情我們繼續往下看,你會發現很簡單。
Begin ... End 語句
通過 begin end 可以來包含多個語句,每個語句以「;」結尾。
Declare
用Declare 來聲明局部變數
Declarevar_Name type defaulevaule
Delare 條件
Declarecondition_Name CONDITION FOR condition_value
調用存儲過程
Call
格式:
Callsp_Name [parameter ]
這里的 sp_Name 必須是由 create procere 創建的名稱。它可以通過聲明的參數來傳回值,
它也返回受影響的行數,在 MySQL 中可以通過 mysql_affected_rows() 來獲得。
流程式控制制語句
IF 語句
IFsearch_condition THENstatement_list
[ELSEIFsearch_condition THENstatement_list]
[ELSEstatement_list]
END IF
CASE 語句
CASE case_value
WHEN when_value THENstatement_list
WHEN when_value THENstatement_list]
ELSEstatement_list]
END CASE
LOOP 語句
[begin_label:] LOOP
statement_list
END LOOP [end_label]
LOOP 實現了一個簡單的循環,通過 LEAVE 來退出
LEAVE 語句
LEAVE lable
退出語句,一般可以用在循環中。
ITERATE 語句
ITERATE lable
ITERATE 一般出現在 LOOP、REPEATE、WHILE 里,意思是再次循環。
REPEATE 語句
[begin_label:] REPEAT
statement_list
UNTILsearch_condition
END REPEAT [end_label]
REPEAT 語句內的語句或語句群被重復,直至 search_condition 為真。
WHILE 語句
[begin_label:] WHILEsearch_condition DO
statement_list
END WHILE [end_label]
WHILE 語句內的語句或語句群被重復,直至 search_condition 為真。
運用實例
下面通過幾個例子來講述他們的應用:
對網站用戶的操作
為了簡單,用戶表只有用戶名和密碼的信息.在服務端,我們建立如下的表:
代碼片段
Drop table if exists user;
Create table user(
Id int unsigned not null auto_increment,
Name varchar(20) not null,
Pwd char(32) not null,
Primary key(Id)
);
添加用戶的存儲過程:
代碼片段
Delimiter //
Create procere insertuser(in username varchar(20),in userpwd varchar(32))
Begin
Insert into welefen.user(Name,Pwd) values (username,md5(userpwd));
End
//
驗證用戶的存儲過程:
代碼片段
Delimiter //
Create procere validateuser(in username varchar(20),out param1)
Begin
Select Pwd into param1 from welefen.user where Name=username;
End
//
修改密碼的存儲過程:
代碼片段
Delimiter //
Create procere modifyPwd(in username varchar(20),in userpwd varchar(32))
Begin
Update welefen.user set Pwd=md5(userpwd) where Name=username;
End
//
刪除用戶的存儲過程:
代碼片段
Delimiter //
Create procere deleteuser(in username varchar(20))
Begin
delete from welefen.user where Name=username;
End
//
在客戶端,我們給出如下的程序:
代碼片段
文件名:ProcereUser.php
<?php
if (!mysql_connect("localhost","root","welefen")){
echo "連接資料庫失敗";
}
if (!mysql_select_db("welefen")){
echo "選擇資料庫表失敗<br>";
}
$insert_user=array("welefen","welefen");//這里的welefen分別為用戶名、密碼
if (mysql_query("call insertuser('$insert_user[0]','$insert_user[1]')")){
echo "添加用戶$insert_user[0]成功<br>";
}else {
echo "添加用戶$insert_user[0]失敗<br>";
}
$validate_user=array("welefen","welefen");//這里的welefen分別為用戶名、密碼
mysql_query("call validateuser('$validate_user[0]',@a)");
$Pwd=mysql_query("select @a");
$result=mysql_fetch_array($Pwd);
if ($result[0]==md5($validate_user[1])){
echo "用戶$validate_user[0]驗證正確<br>";
}else {
echo "用戶$validate_user[0]驗證錯誤<br>";
}
$modify_Pwd=array("welefen","weilefeng"); //welefen為用戶名weilefeng為新密碼
if (mysql_query("call modifyPwd('$modify_Pwd[0]','$modify_Pwd[1]')")){
echo "用戶$modigy_Pwd[0]的密碼修改成功<br>";
}else {
echo "用戶$modigy_Pwd[0]的密碼修改失敗<br>";
}
$delete_user=array("welefen"); //welefen為用戶名
if (mysql_query("call deleteuser('$delete_user[0]')")){
echo "用戶$delete_user[0]刪除成功<br>";
}else {
echo "用戶$delete_user[0]刪除失敗<br>";
}
?
程序運行的結果:
執行結果
添加用戶welefen 成功
用戶welefen 驗證正確
用戶welefen 的密碼修改成功
用戶welefen 刪除成功
以上的這個程序簡單的說明了Mysql 中的存儲過程結合PHP 的應用,當然在實際應用要比這個
復雜的多。
驗證角谷猜想
角谷猜想:給定一個整數x,若x%2=1,則x=3*x+1,否則x=x/2,如此循環下去,經過有限步驟必
能得到1。
例 如 : 初 始 整 數 為 9 , 則
9->28->14->7->22->11->34->17->52->26->13->40->20->10->5->16->8->4->2->1
為了說明存儲過程中一些語法的應用,我們通過存儲過程來實現它:
執行結果
mysql> delimiter //
mysql> create procere jgguess(in number int)
-> begin
-> declare param1 int default 1;
-> set @a=concat(number);
-> jiaogu:loop #循環開始
-> set param1=number%2;
-> if param1=1 then set number=number*3+1; #number 為奇數,將它乘3加 1
-> else set number=number/2;
-> end if;
-> set @a=concat(@a,'->',number);
-> if number>1 then iterate jiaogu; #number 不為 1,繼續循環
-> end if;
-> leave jiaogu; #退出循環
-> end loop jiaogu;
-> end
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> call jgguess(11);
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> select @a//
+-------------------------------------------------------+
| @a |
+-------------------------------------------------------+
| 11->34->17->52->26->13->40->20->10->5->16->8->4->2->1 |
+-------------------------------------------------------+
1 row in set (0.02 sec)
在這個存儲過程中,你傳入的參數不能超過int 型數據的范圍,否則就會報錯。
觸發器
觸發器是與表有關的命名資料庫對象,當表上出現特定事件時,將激活該對象。例如當我們向
某個表插入一行數據時發生一個事件或者刪除某個記錄時觸發某個事件。
語法:
CREATE TRIGGER trigger_Name trigger_time trigger_event
ON tbl_Name FOR EACHROW trigger_stmt
trigger_time 是觸發器的動作時間。它可以是 BEFORE 或 AFTER ,以指明觸發器是在激活它的
語句之前或之後觸發。
trigger_event 指明了激活觸發器的語句的類型。trigger_event 可以是下述值之一:
INSERT:將新行插入表時激活觸發器,例如,通過 INSERT、LOADDATA 和 REPLACE 語句;
UPDATE:更改某一行時激活觸發器,例如,通過UPDATE語句;
DELETE:從表中刪除某一行時激活觸發器,例如,通過 DELETE 和 REPLACE 語句。
例如當我們向上面的user 表中增加一個用戶名為「welefen 」時,我們把記錄用戶數的表的值增
加 1;
代碼片段
Create table numuser(
Num int not null default 0
);
Delimiter //
Create trigger testnum after insert on welefen.user for each row
Begin
Update welefen.numuser set Num=Num+1;
End
//
視圖
當我們想得到數據表中某些欄位的信息,並想把他們保存時我們就可以用視圖。
語法:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_Name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
例如我們想對上面的用戶表使用視圖,可以這樣:
Create viewwelefen.userview as select * fromwelefen.user;
查看視圖的信息可以使用:
Select * fromwelfen.userview;
Ⅳ MySQL中創建存儲過程中命令號客戶機的分隔符
第一步,雙擊打開MySQL Workbench客戶端,連接資料庫book,創建資料庫存儲過程,如下圖所示:
如何利用MySQL Workbench中的游標創建存儲過程
第二步,編寫存儲過程命令,聲明變數和游標,打開游標,fetch和關閉游標,如下圖所示:
如何利用MySQL Workbench中的游標創建存儲過程
第三步,然後運行存儲過程,「Apply SQL Script to Database」,如下圖所示:
如何利用MySQL Workbench中的游標創建存儲過程
第四步,點擊「Apply」進行執行存儲過程,如下圖所示:
如何利用MySQL Workbench中的游標創建存儲過程
第五步,勾選執行SQL語句,接著單擊「Finish」,完成SQL語句執行,如下圖所示:
如何利用MySQL Workbench中的游標創建存儲過程
第六步,調用存儲過程,並查看執行存儲過程的結果,如下圖所示:
如何利用MySQL Workbench中的游標創建存儲過程
Ⅵ Mysql里如何使用存儲過程
CREATE DEFINER 存儲過程名
@變數1 類型 ----這里個就是傳進來的
@變數2 類型 output ----這個是定義輸出變數
as
declared @變數 類型,@變數 類型 --這里是定義內部變數 只能這是過程用
if 條件
begin
#¥%……&*
end
else
begin
#¥%……&
end
-----不知道你要什麼
execute 資料庫名.dbo.過程名 -----這個是 在這個過程里 調用別的過程
Ⅶ 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];
Ⅷ 調用存儲過程返回集出錯Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result
說明$rs為空,所以用mysql_fetch_array沒有得到數據,所以會報錯
Ⅸ MySQL存儲過程創建,我錯在哪裡了
你這個要取輸入的ROWS以後的學生學號?
open cur;
FETCH cur into sno; 這里要用for循環啊。
不然你游標裡面的數據很多,不可能都保存到sno裡面的。
LOOP
FETCH cur into sno;
while FOUND DO
set ROWS=ROWS+1;
END LOOP
這樣你的ROWS才會實現不停+1功能
Ⅹ 怎麼寫mysql存儲過程,並用php調用它
實現原理
首先,需要知道怎麼寫mysql存儲過程,了解mysq存儲過程語言,
其次,使用mysql工具創建存儲過程。
最後,通過mysql_query()函數執行mysql變數的設置和mysql存儲過程及返回值。
具體代碼如下:
mysql存儲過程代碼
createprocerepro_name(user_idint)
begin
.........
end
2. PHP代碼
$host="localhost";
$user="root";
$password="232412";
$db="user_db";
$dblink=mysql_connect($host,$user,$password)ordie("can'tconnecttomysql");
mysql_select_db($db,$dblink)ordie("can'tselectuser_db");
$user_id=1;
$res=mysql_query("set@a=$user_id",$dblink);
$res=mysql_query("callpro_name(@a)",$dblink);