mysql 儲存過程 游標

2021-08-17 22:09:40 字數 3335 閱讀 2324

宣告游標

declare cursor_name cursor for select_statement

這個語句宣告乙個游標。也可以在子程式中定義多個游標,但是乙個塊中的每乙個游標必須有唯一的名字。

開啟游標

open cursor_name

這個語句開啟先前宣告的游標。

游標fetch

fetch cursor_name into var_name [, var_name] ...

這個語句用指定的開啟游標讀取下一行(如果有下一行的話),

並且前進游標指標。

關閉游標close

close cursor_name

這個語句關閉先前開啟的游標。

如果未被明確地關閉,游標在它被宣告的復合語句的末

尾被關閉。

游標的特性:

read only 唯讀,只能取值而不能賦值;

not scroolable 不可回滾,只能順序讀取;

asensitive 敏感,不能在已經開啟游標的表上執行

update事務;

舉例:

create table stu_sumscore(name char(16),sum_score int);

delimiter //

create procedure sp_cur()

begin

declare done int default 0;

declare v_id,v_name char(16);

declare v_subjectid,v_score int;

declare cur1 cursor for select distinct id from stu_grade;

declare continue handler for sqlstate '02000' set done = 1;

open cur1;

repeat

fetch cur1 into v_id;

select sum(score) into v_score from stu_grade where id=v_id;

select name into v_name from stud_info where id=v_id;

if not done then

insert into stu_sumscore values (v_name,v_score);

end if;

until done end repeat;

close cur1; /*close cur2;*/

end//

delimiter ;

如何進行多表關聯的批量插入操作:

1、先採用多表關聯將關聯字段取出來:

select p.server_user_sn,p.server_user_sn,t.td_code,p.customer_name2,s.`server`from plate_account_info p

join plate_service_all_info t on p.server_info_id=t.server_info_id and p.server_user_sn=t.server_user_sn

join server_info s on p.server_info_id=s.server_info_id

2、利用游標來存放多表關聯的資料

3、開啟游標,將關聯的結果集資料一行一行的讀取出來

4、利用迴圈語句對游標中每次讀取出來的單行記錄進行造資料插入到兩一張表中

5、此處mysql對於游標中的多個欄位列的取值只能定義變數去接受

比如:declare name char(50);

open cur1;

select next from cur1 into name;

舉例:

drop procedure if exists test5;

delimiter //

create procedure test5()

begin

declare server_info_id int;

declare server_user_sn int default null;

declare yw_code char(50) default null;

declare customer_name char(200) default null;

declare t_server char(50) default null;

declare success_amount int default 100;

declare fail_amount int default 50;

declare unknow_amount int default 1;

declare submit_amount int default 150;

declare num int;

declare done int default 0;

declare mycur cursor for select a.server_info_id,a.server_user_sn,b.`server`,c.customer_name,c.yw_code from plate_service_all_info a join server_info b on a.server_info_id = b.server_info_id

join plate_account_info c on c.server_info_id = b.server_info_id;

set num =0;

open mycur;

while num<100 && done=0 do

fetch mycur into server_info_id,server_user_sn,t_server,customer_name,yw_code;

insert into submit_history_statistic_count values ('',server_info_id, server_user_sn, yw_code, success_amount, fail_amount, unknow_amount, submit_amount, now(),now(), customer_name, t_server);

set num = num + 1;

end while;

close mycur;

end //

delimiter ;

call test5()

mysql 游標 儲存過程

1.首先需要注意的是mysql中游標必須要建立在儲存過程中 2.直接上sql 查詢當天資料 select in flow out flow from water meter data where 1 1 and date sys read time curdate 1 order by in flo...

MySQL 儲存過程 游標

儲存過程 本儲存過程有特殊執行迴圈數量的要求,是對security market history表進行修正 判斷儲存過程是否存在 drop procedure if exists proc security market history update create procedure proc se...

MySQL 游標和儲存過程

我們有時候會遇到需要對 從a表查詢的結果集s s 的記錄 進行遍歷並做一些操作 如插入 且這些操作需要的資料或許部分來自s s集合 臨時儲存過程,沒辦法,不能直接在查詢視窗做這些事。drop procedure ifexists proc tmp create procedure proc tmp ...