存儲過程加游標一起使用的基本操作


  1 -- 存儲過程  加  游標
  2 
  3 -- 建表
  4 create table student(
  5 sid varchar(8) primary key,
  6 sname varchar(10),
  7 sex varchar(2),
  8 age int,
  9 classno varchar(6)
 10 );
 11 -- 表中的數據
 12 insert into student values
 13 ('20170101','張石瑞','','19','201701'),
 14 ('20170201','李佛','','20','201702'),
 15 ('20170202','王法無','','19','201702')
 16 
 17 /* 創建游標和關閉游標的四個步驟
 18 -- 1、創建游標  (cur_name 游標名字)
 19 declare cur_name cursor for select 語句;
 20 -- 2、打開游標
 21 open cur_name;
 22 -- 3、提取游標數據
 23 fetch cur_name [into 變量1,變量2,、、、、、];
 24 -- 4、關閉(釋放)游標
 25 close cur_name;
 26 */
 27 -- 游標的基本提取操作
 28 create PROCEDURE proc1()
 29 BEGIN
 30 declare cur_sid varchar(20);
 31 declare cur_sname varchar(20);
 32 declare cur_sex varchar(20);
 33 declare cur_age varchar(20);
 34 declare cur_classno varchar(20);
 35 -- 1、
 36 declare student_cur1 CURSOR for
 37 select sid,sname,sex,age,classno from student;
 38 -- 2、
 39 open student_cur1;
 40 -- 3、
 41 fetch student_cur1 into cur_sid,cur_sname,cur_sex,cur_age,cur_classno;
 42 select cur_sid,cur_sname,cur_sex,cur_age,cur_classno;
 43 -- 4、
 44 close student_cur1;
 45 END
 46 
 47 -- 執行存儲過程
 48 call proc1();
 49 -- 刪除存儲過程
 50 drop procedure if exists proc1
 51 
 52 
 53 
 54 -- 游標的循環遍歷‘
 55 create PROCEDURE proc2()
 56 BEGIN
 57 declare cur_sid varchar(20);
 58 declare cur_sname varchar(20);
 59 declare cur_sex varchar(20);
 60 declare cur_age varchar(20);
 61 declare cur_classno varchar(20);
 62 
 63 declare sum int default 0;
 64 declare i int default 0;
 65 -- 1、
 66 declare student_cur1 CURSOR for
 67 select sid,sname,sex,age,classno from student;
 68 -- 2、
 69 open student_cur1;
 70 -- 3、 最簡單的  while 遍歷方法
 71 select count(sid) into sum from student;
 72 while i<sum DO
 73     fetch student_cur1 into cur_sid,cur_sname,cur_sex,cur_age,cur_classno;
 74     select cur_sid,cur_sname,cur_sex,cur_age,cur_classno;
 75     set i=i+1;
 76 end while;
 77 -- 4、
 78 close student_cur1;
 79 END
 80 
 81 -- 執行存儲過程
 82 call proc2();
 83 -- 刪除存儲過程
 84 drop procedure if exists proc2
 85 
 86 
 87 -- 使用 loop 遍歷游標
 88 create PROCEDURE proc3()
 89 BEGIN
 90 declare cur_sid varchar(20);
 91 declare cur_sname varchar(20);
 92 declare cur_sex varchar(20);
 93 declare cur_age varchar(20);
 94 declare cur_classno varchar(20);
 95 
 96 declare state int default false; -- 定義表示用於判斷游標是否溢出
 97 -- 1、
 98 declare student_cur1 CURSOR for
 99 select sid,sname,sex,age,classno from student;
100 -- 2、
101 open student_cur1;
102 -- 3、 loop 遍歷游標
103 cur_loop:loop -- 循環開始
104 -- 循環開始的時候提取一次
105         fetch student_cur1 into cur_sid,cur_sname,cur_sex,cur_age,cur_classno;
106         select cur_sid,cur_sname,cur_sex,cur_age,cur_classno;
107 
108         if state then
109             leave cur_loop; 
110         end if; 
111 end loop; -- 循環結束
112 -- 4、
113 close student_cur1;
114 END
115 
116 -- 執行存儲過程
117 call proc3()
118 -- 刪除存儲過程
119 drop procedure if exists proc3
120 
121 
122 
123 
124 /*
125 fetch是獲取游標當前指向的數據行,並將指針指向下一行,當游標已經指向最后一行時繼續執行會造成游標溢出。
126 使用loop循環游標時,他本身是不會監控是否到最后一條數據了,像下面代碼這種寫法,就會造成死循環;
127 
128 read_loop:loop  
129 fetch cur into n,c;  
130 set total = total+c;  
131 end loop;  
132 在MySql中,造成游標溢出時會引發mysql預定義的NOT FOUND錯誤,所以在上面使用下面的代碼指定了當引發not found錯誤時定義一個continue 的事件,指定這個事件發生時修改done變量的值。
133 
134 declare continue HANDLER for not found set done = true;  
135 也有這樣寫的
136 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' set done = true; 
137 所以在循環時加上了下面這句代碼:
138 
139 --判斷游標的循環是否結束  
140 if done then  
141     leave read_loop;    --跳出游標循環  
142 end if;  
143 如果done的值是true,就結束循環。繼續執行下面的代碼。
144 
145 */
146 
147 
148 
149 
150 
151 
152 
153 
154 -- 性別翻轉
155 
156 create PROCEDURE proc4()
157 BEGIN
158 declare cur_sid int;
159 declare cur_sex varchar(1);
160 
161 declare state int default false;
162 -- 1、
163 declare sex_cur cursor for select sid,sex from student;
164 -- 
165 declare CONTINUE HANDLER for not found set state=true;
166 -- 2、
167 open sex_cur;
168 -- 3、
169 sex_loop:LOOP -- 循環開始
170     fetch sex_cur into cur_sid,cur_sex;
171         if state then
172             leave sex_loop;
173         end if;
174          if cur_sex='' then
175             update student set sex='' where sid=cur_sid;
176         end if;
177          if cur_sex='' then
178             update student set sex='' where sid=cur_sid;
179         end if;
180 end loop; -- 循環結束
181 -- 4、
182 close sex_cur;
183 END
184 
185 
186 
187 
188 
189 
190 -- 執行存儲過程
191 call proc4()
192 -- 刪除存儲過程
193 drop procedure if exists proc4
194 
195 
196 
197 
198 
199 -- 表的查詢
200 select * from student

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM