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的表的時候,每個表的數據以一個單獨的文件來存放,這個時候的單表限制,又變成文件系統的大小限制了。
『貳』 MySql 存儲過程遍歷游標出錯
MySql 存儲過程遍歷游標出錯
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET DONE = 1;
這種語句是異常捕獲內容,在mysql中都是使用HANDLER 來捕獲異常的。
建議你看下:MySQL存儲過程詳解
MySQL游標循環遍歷的使用
『叄』 mysql中一個存儲過程中是不是只能有一個游標,不能多個游標
不是,,,,
可以多個游標,,,
游標和循環差不多,過程裡面可以有多個循環,自然也可以有多個游標,
而且還有嵌套游標
『肆』 mysql 存儲過程 游標什麼億is
存儲過程和函數(存儲在 mysql資料庫中的 proc表,所以檢查有沒有這個表)
存儲過程是一種存儲程序(如正規語言里的子程序一樣),mysql支持有兩種:存儲過程,在其他SQL語句中可以返回值的函數(使用起來和 mysql預裝載的函數一樣,如 pi())
一個存儲過程包括名字,參數列表,以及可以包括很多SQL語句的SQL語句集。
as:(復合語句塊)
CREATE PROCEDURE procere1 /*name存儲過程名*/
(in parameter1 interger) /*parameters參數*/
BEGIN /*start of block 語句塊頭*/
DECLARE varialbe1 CHAR(10); /* variables 變數聲明*/
IF parameter1 = 100 THEN /*start of IF if條件*/
SET variable1 = 'birds'; /*assignment 賦值*/
ELSE
SET variable1 = 'beasts'; /*assignment 賦值*/
END IF; /*end of if if結束*/
INSERT INTO table1 values(variable1); /*statement SQL語句*/
END;
『伍』 mysql存儲過程游標結果集時,數據沒有遍歷完整
CREATEDEFINER=`root`@`%`PROCEDURE`insertPresale`()
BEGIN
#Routinebodygoeshere...
DECLAREdoneINTDEFAULT0;/*用於判斷是否結束循環*/
DECLAREgoodsIdVARCHAR(255);#標記商品id
DECLAREflagINTDEFAULT0;#標記資料庫是否包含此條商品記錄
/*用於存儲結果集的記錄*/
/*定義游標*/
_idFROM`sys_goods_publish`WHEREpresale=1ANDpresale_time<=NOW();
/*定義設置循環結束標識done值怎麼改變的邏輯*/
=1;/*done=true;亦可*/
OPENidCur;/*打開游標*/
/*循環開始*/
REPEAT
#/*如果要fetch多列應該這樣寫,fetchcur/*對應下面的idCur*/
FETCHidCurINTOgoodsId;/*還可以fetch多列(假設結果集的記錄不是單列的話)*/
IFNOTdoneTHEN/*數值為非0,MySQL認為是true*/
SELECTCOUNT(*)INTOflagFROM`itemsinfonew`WHERETaoBaoitemId=goodsId;
IF(flag>0)THEN#如果資料庫中有爬取此條記錄則刪除已用戶發布的為准
DELETEFROM`itemsinfonew`WHERETaoBaoitemId=goodsId;
ENDIF;
INSERTINTO`itemsinfonew`(TaoBaoitemId,CouponID,CreateSourceName)
SELECTgoods_id,coupon_id,SUBSTRING("customer_fd",0.5)
FROM`sys_goods_publish`
WHEREpresale_time<=NOW()ANDgoods_id=goodsId;
UPDATE`sys_goods_publish`SETpresale=0WHEREpresale=1ANDpresale_time<=NOW()ANDgoods_id=goodsId;
ENDIF;
UNTILdoneENDREPEAT;
CLOSEidCur;/*關閉游標*/
『陸』 mysql存儲過程游標循環用哪種比較好
如果沒有則插入數據,如果有則更新的方法:
insert into `test` values (a,b) ON DUPLICATE KEY UPDATE `a`=c;
[sql] view plain
CREATE PROCEDURE `test`.`new_procere` ()
BEGIN
-- 需要定義接收游標數據的變數
DECLARE a CHAR(16);
-- 游標
DECLARE cur CURSOR FOR SELECT i FROM test.t;
-- 遍歷數據結束標志
DECLARE done INT DEFAULT FALSE;
-- 將結束標志綁定到游標
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 打開游標
OPEN cur;
-- 開始循環
read_loop: LOOP
-- 提取游標里的數據,這里只有一個,多個的話也一樣;
FETCH cur INTO a;
-- 聲明結束的時候
IF done THEN
LEAVE read_loop;
END IF;
-- 這里做你想做的循環的事件
INSERT INTO test.t VALUES (a);
END LOOP;
-- 關閉游標
CLOSE cur;
END
實例2
[sql] view plain
BEGIN
DECLARE Done INT DEFAULT 0;
DECLARE CurrentLingQi INT;
DECLARE ShizuName VARCHAR(30);
/* 聲明游標 */
DECLARE rs CURSOR FOR SELECT NodeName, LingQi FROM socialrelation;
/* 異常處理 */
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;
/* 打開游標 */
OPEN rs;
/* 逐個取出當前記錄LingQi欄位的值,需要進行最大值的判斷 */
FETCH NEXT FROM rs INTO ShizuName, CurrentLingQi;
/* 遍歷數據表 */
REPEAT
IF NOT Done THEN
SET CurrentLingQi = CurrentLingQi + 60;
/* 如果更新後靈氣值大於允許的最大值,則就設置為最大值 */
IF CurrentLingQi >= 1800 THEN
UPDATE socialrelation SET LingQi = 1800 WHERE NodeName = ShizuName;
ELSE
/* 否則,正常更新 */
UPDATE socialrelation SET LingQi = LingQi + 60 WHERE NodeName = ShizuName;
END IF;
END IF;
FETCH NEXT FROM rs INTO ShizuName, CurrentLingQi;
UNTIL Done END REPEAT;
/* 關閉游標 */
CLOSE rs;
END
『柒』 mysql存儲過程中能返回遊標嗎
MySQL中可以返回一個記錄集 , 比如直接 select * from test_table; ,你在程序中直接調這個存儲過程,存儲過程會返回這些記錄集到你的客戶端應用程序中。
但無法返回遊標。
『捌』 MySql資料庫的存儲過程能返回遊標么
不知道mysql這個跟oracle裡面,是不是一致的,下面是我學習的時候總結的
如果一個過程要返回一個結果集,那麼要引用游標來處理這個結果集。
create or replace procere Test
(
varEmpName emp.ename%type
)
As
begin ------會報錯.錯誤原因沒有into子句.
select * from emp where ename like '%'||varEmpName||'%';
end;
這個程序我們無法用into,因為在Oracle裡面沒有一個類型去接受一個結果集.這個時候我們可以聲明游標對象去接受他.
有倆種方法:
一種是聲明系統游標,一種是聲明自定義游標,然後後面操作一樣,參數類型為
in out 或out
(1)聲明個人系統游標.(推薦)
create or replace p_temp_procere
(
cur_arg out sys_refcursor; --方法1
)
begin
open cur_arg for select * from tablename;
end
調用
declare
cur_calling sys_refcursor;
begin
p_temp_procere(cur_calling); --這樣這個游標就有值了
for rec_next in cur_calling loop
....
end loop;
end;
(2)在包頭中申明一個游表類型,然後調用者申明一個這個類型的游標變數,傳給返回遊標的存儲過程 ,存儲過程out這個結果集,這種方法很麻煩.游標類型不能像索引表一樣使用create or replace type方法來創建,所以只能在包中申明,並且需要使用/來執行,後面的存儲過程才認這個游標類型.(不推薦,但是建議要知道並且要會這種方式,畢竟它有它存在的道理)
--定義全局變數
create or replace package pkg_package
as
type type_cursor is ref cursor;
type type_record is record
(
test01 varchar2(32),
test02 varchar2(32),
test03 varchar2(32)
);
end;
/
--創建返回遊標的存儲過程
create or replace procere p_temp_procere
(
cur_out_arg out pkg_package.type_cursor
)
is
begin
open cur_out_arg for select * from test;
end;
/
--調用
declare
cur_out_arg pkg_package.type_cursor;
rec_arg pkg_package.type_record;
begin
p_temp_procere(cur_out_arg);
fetch cur_out_arg into rec_arg;
dbms_output.put_line(rec_arg.test01);
dbms_output.put_line(rec_arg.test02);
dbms_output.put_line(rec_arg.test03);
end;
『玖』 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
『拾』 mysql存儲過程中使用游標的實例
復制代碼
代碼如下:
DELIMITER
$$
DROP
PROCEDURE
IF
EXISTS
getUserInfo
$$
CREATE
PROCEDURE
getUserInfo(in
date_day
datetime)
--
--
實例
--
MYSQL存儲過程名為:getUserInfo
--
參數為:date_day日期格式:2008-03-08
--
BEGIN
declare
_userName
varchar(12);
--
用戶名
declare
_chinese
int
;
--
語文
declare
_math
int
;
--
數學
declare
done
int;
--
定義游標
DECLARE
rs_cursor
CURSOR
FOR
SELECT
username,chinese,math
from
userInfo
where
datediff(createDate,
date_day)=0;
DECLARE
CONTINUE
HANDLER
FOR
NOT
FOUND
SET
done=1;
--
獲取昨天的日期
if
date_day
is
null
then
set
date_day
=
date_add(now(),interval
-1
day);
end
if;
open
rs_cursor;
cursor_loop:loop
FETCH
rs_cursor
into
_userName,
_chinese,
_math;
--
取數據
if
done=1
then
leave
cursor_loop;
end
if;
--
更新表
update
infoSum
set
total=_chinese+_math
where
UserName=_userName;
end
loop
cursor_loop;
close
rs_cursor;
END$$
DELIMITER
;