mysql存儲過程游標嵌套
mysql的存儲過程定義一個游標
-- 定義游標cursor c_emp is select ename,job from emp where xx;-
當作普通的查詢語句就OK啦!
B. mysql存儲過程 游標雙重循環
在老版本的MySQL 3.22中,MySQL的單表限大小為4GB,當時的MySQL的存儲引擎還是ISAM存儲引擎。但是,當出現MyISAM存儲引擎之後,也就是從MySQL 3.23開始,MySQL單表最大限制就已經擴大到了64PB了(官方文檔顯示)。也就是說,從目前的技術環境來看,MySQL資料庫的MyISAM存儲 引擎單表大小限制已經不是有MySQL資料庫本身來決定,而是由所在主機的OS上面的文件系統來決定了。
而MySQL另外一個最流行的存儲引擎之一Innodb存儲數據的策略是分為兩種的,一種是共享表空間存儲方式,還有一種是獨享表空間存儲方式。
當使用共享表空間存儲方式的時候,Innodb的所有數據保存在一個單獨的表空間裡面,而這個表空間可以由很多個文件組成,一個表可以跨多個文件存在,所 以其大小限制不再是文件大小的限制,而是其自身的限制。從Innodb的官方文檔中可以看到,其表空間的最大限制為64TB,也就是說,Innodb的單 表限制基本上也在64TB左右了,當然這個大小是包括這個表的所有索引等其他相關數據。
而當使用獨享表空間來存放Innodb的表的時候,每個表的數據以一個單獨的文件來存放,這個時候的單表限制,又變成文件系統的大小限制了。
C. mysql 游標中可以嵌套游標嗎
CREATE PROCEDURE SumOfStu(OUT Sdeptno int,OUT Sdeptname char(20),OUT sumBefore int,OUT sumAfter int)
BEGIN
DECLARE l_sum int;
DECLARE l_Sdeptno int;
DECLARE l_sno int;
DECLARE l_sumBefore int;
DECLARE done, done2 INT DEFAULT 0;
DECLARE cur_out cursor for select SdeptNo,population from Department;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur_out;
REPEAT
SET l_sum=0;
FETCH cur_out INTO l_Sdeptno,l_sumBefore;
IF NOT done THEN
BEGIN
DECLARE cur_inner cursor for select Sno from student where SdeptNo=l_Sdeptno;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done2 = 1;
OPEN cur_inner;
REPEAT
FETCH cur_inner into l_sno;
IF NOT done2 THEN
SET ps_count = 0;
SET l_sum=l_sum+1;
END IF;
UNTIL done2
END REPEAT;
CLOSE cur_inner;
SET done2 = 0;
END;
IF(l_sum<>l_sumBefore) THEN
update department SET population=l_sum where SdeptNo=l_Sdeptno;
select l_Sdeptno INTO Sdeptno;
select SdeptName INTO Sdeptname from Department where SdeptNo=l_Sdeptno;
select l_sumBefore INTO sumBefore;
select l_sum INTO sumAfter;
end IF;
END IF;
UNTIL done
END REPEAT;
CLOSE cur_out;
END
D. Mysql 資料庫的事件和存儲過程的問題
我給你舉個例子吧!
MySQL存儲過程例子,包含事務,參數,嵌套調用,游標,循環等,閱讀MySQL存儲過程例子,包含事務,參 數,嵌套調用,游標,循環等,view plain to clipboardprint?drop procere if exists pro_rep_shadow_rs; delimiter | -------------------------------
view plain to clipboardprint?
drop procere if exists pro_rep_shadow_rs;
delimiter |
----------------------------------
-- rep_shadow_rs
-- 用來處理信息的增加,更新和刪除
-- 每次只更新上次以來沒有做過的數據
-- 根據不同的標志位
-- 需要一個輸出的參數,
-- 如果返回為0,則調用失敗,事務回滾
-- 如果返回為1,調用成功,事務提交
--
-- 測試方法
-- call pro_rep_shadow_rs(@rtn);
-- select @rtn;
----------------------------------
create procere pro_rep_shadow_rs(out rtn int)
begin
-- 聲明變數,所有的聲明必須在非聲明的語句前面
declare iLast_rep_sync_id int default -1;
declare iMax_rep_sync_id int default -1;
-- 如果出現異常,或自動處理並rollback,但不再通知調用方了
-- 如果希望應用獲得異常,需要將下面這一句,以及啟動事務和提交事務的語句全部去掉
declare exit handler for sqlexception rollback;
-- 查找上一次的
select eid into iLast_rep_sync_id from rep_de_proc_log where tbl='rep_shadow_rs';
-- 如果不存在,則增加一行
if iLast_rep_sync_id=-1 then
insert into rep_de_proc_log(rid,eid,tbl) values(0,0,'rep_shadow_rs');
set iLast_rep_sync_id = 0;
end if;
-- 下一個數字
set iLast_rep_sync_id=iLast_rep_sync_id+1;
-- 設置默認的返回值為0:失敗
set rtn=0;
-- 啟動事務
start transaction;
-- 查找最大編號
select max(rep_sync_id) into iMax_rep_sync_id from rep_shadow_rs;
-- 有新數據
if iMax_rep_sync_id>=iLast_rep_sync_id then
-- 調用
call pro_rep_shadow_rs_do(iLast_rep_sync_id,iMax_rep_sync_id);
-- 更新日誌
update rep_de_proc_log set rid=iLast_rep_sync_id,eid=iMax_rep_sync_id where tbl='rep_shadow_rs';
end if;
-- 運行沒有異常,提交事務
commit;
-- 設置返回值為1
set rtn=1;
end;
|
delimiter ;
drop procere if exists pro_rep_shadow_rs_do;
delimiter |
---------------------------------
-- 處理指定編號范圍內的數據
-- 需要輸入2個參數
-- last_rep_sync_id 是編號的最小值
-- max_rep_sync_id 是編號的最大值
-- 無返回值
---------------------------------
create procere pro_rep_shadow_rs_do(last_rep_sync_id int, max_rep_sync_id int)
begin
declare iRep_operationtype varchar(1);
declare iRep_status varchar(1);
declare iRep_Sync_id int;
declare iId int;
-- 這個用於處理游標到達最後一行的情況
declare stop int default 0;
-- 聲明游標
declare cur cursor for select id,Rep_operationtype,iRep_status,rep_sync_id from rep_shadow_rs where rep_sync_id between last_rep_sync_id and max_rep_sync_id;
-- 聲明游標的異常處理,設置一個終止標記
declare CONTINUE HANDLER FOR SQLSTATE '02000' SET stop=1;
-- 打開游標
open cur;
-- 讀取一行數據到變數
fetch cur into iId,iRep_operationtype,iRep_status,iRep_Sync_id;
-- 這個就是判斷是否游標已經到達了最後
while stop <> 1 do
-- 各種判斷
if iRep_operationtype='I' then
insert into rs0811 (id,fnbm) select id,fnbm from rep_shadow_rs where rep_sync_id=iRep_sync_id;
elseif iRep_operationtype='U' then
begin
if iRep_status='A' then
insert into rs0811 (id,fnbm) select id,fnbm from rep_shadow_rs where rep_sync_id=iRep_sync_id;
elseif iRep_status='B' then
delete from rs0811 where id=iId;
end if;
end;
elseif iRep_operationtype='D' then
delete from rs0811 where id=iId;
end if;
-- 讀取下一行的數據
fetch cur into iId,iRep_operationtype,iRep_status,iRep_Sync_id;
end while; -- 循環結束
close cur; -- 關閉游標
end;
|
E. mysql 存儲過程可以嵌套調用嗎
當然可以,也可以調用其他的函數或者自定義函數,當要看你MYSQL的版本哦
F. mysql 存儲過程嵌套循環 第一次內循環能插入數據,之後不能成功插入數據,求解!!
1. 首先你應該看下循環條件是否已經走完,
2. 其次看所插數據是否滿足表中的欄位格式,再然後,看看SQL有沒有明顯的錯誤。
3. 如果檢查完還沒好,麻煩把SQL發我,我看下。
G. mysql 存儲過程過程 循環游標
游標關閉條件
H. mysql 怎樣在loop 循環中聲明游標,如下圖所示,在聲明第二個游標(cus2)竟然出錯了,希望能夠大神指點.
mysql的游標是不能放到循環中創建的。你想要實現你原有功能的話,可以把第二個游標定義到另外一個存儲過程中,然後在創建第二個游標的地方改成調用新建的存儲過程(CALL PROC_NAME()),並且把你循環第二個游標想做的事也放到新建的存儲過程裡面去,就ok了
I. mysql中存儲過程和游標調用問題
不知道你 什麼版本的 mysql
1、
我使用的 mysql, 好像沒有 create or replace procere 這樣的語法。
只能 create procere
可能是我的 mysql 版本太低了吧...
2、
MySQL 存儲過程名字後面的「()」是必須的,即使沒有一個參數,也需要「()」
這個不知道是不是也是我mysql 版本太低的問題。
create or replace procere proc_updateDist
修改為
create procere proc_updateDist ()
3、游標部分, 缺少了 DECLARE CONTINUE HANDLER
以及 判斷什麼時候退出循環的語句。
http://wenku..com/view/b0f2944f767f5acfa1c7cde3.html
J. 在MySql資料庫中實現一個存儲過程,在這個存儲過程中,需要用游標,動態SQL,詳情點擊查看。。。
DECLAREstuNameVARCHAR(50);
DECLAREflagINT;
DECLAREupdate_cursorCURSOR
FOR
SELECTstu_nameFROMstudentWHEREid=id;
=1;
SETflag=0;
OPENupdate_cursor;
REPEAT/*循環*/
FETCHupdate_cursorINTOstuName;
SETjson=CONCAT(json,',',stuName);
UNTILflag
ENDREPEAT;
CLOSEupdate_cursor;