sql 中CURSOR 的使用


CURSOR是游標,常用於腳本處理。

這里主要介紹自己常用的方法,同時也會把網上的一般格式進行解釋。

一、游標一般格式:
DECLARE 游標名稱 CURSOR FOR SELECT 字段1,字段2,字段3,... FROM 表名 WHERE ...
OPEN 游標名稱
FETCH NEXT FROM 游標名稱 INTO 變量名1,變量名2,變量名3,...
WHILE @@FETCH_STATUS=0
        BEGIN
                  SQL語句執行過程... ...
                  FETCH NEXT FROM 游標名稱 INTO 變量名1,變量名2,變量名3,...
        END
CLOSE 游標名稱
DEALLOCATE 游標名稱 (刪除游標)

一般格式sql舉例如下:

table1結構如下
 id    int
 name  varchar(50)
 
 declare @id int
 declare @name varchar(50)
 declare cursor1 cursor for         --定義游標cursor1
 select * from table1               --使用游標的對象(跟據需要填入select文)
 open cursor1                       --打開游標
 
 fetch next from cursor1 into @id,@name  --將游標向下移1行,獲取的數據放入之前定義的變量@id,@name中
 
 while @@fetch_status=0           --判斷是否成功獲取數據   進入循環
 begin
 update table1 set name=name+'1'
 where id=@id                           --進行相應處理(跟據需要填入SQL文)
 
 fetch next from cursor1 into @id,@name  --將游標向下移1行  相當於for(int i;i<n;i++) 中的i+1
 end
 
 close cursor1                   --關閉游標
 deallocate cursor1
————————————————
版權聲明:本文為CSDN博主「紫葉溪」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/a876030877/java/article/details/79923410


其中while循環的判斷條件:

@@FETCH_STATUS =0   FETCH 語句成功
@@FETCH_STATUS =-1 FETCH 語句失敗或此行不在結果集中

@@FETCH_STATUS =-2 被提取的行不存在

二、我常用的一般格式:
DECLARE 游標名稱 CURSOR FOR SELECT * FROM 表名 WHERE ...

begin
  dbms_output.enable(buffer_size=>null);
  for 變量名 in 游標名稱 loop

                  SQL語句執行過程... ... 獲取游標里的值 直接用 變量名.字段名
            
        END LOOP;
CLOSE 游標名稱
DEALLOCATE 游標名稱 (刪除游標)

 

三、嵌套循環:
案例: 紅色部分是對於第二點常用格式上的添加,使得可以在循環中嵌套循環

declare
TYPE daynamic_cursor_type IS REF CURSOR; --黃色部分自定義
cursor bscl_mc_cur is
SELECT d.bscl_mc
FROM DB_YWBZ.ecm_bscl_common_content_data@db_ywbz_sc_old d
WHERE d.bscl_mc is not null
group by d.bscl_mc;
cur_zj_rows daynamic_cursor_type; --定義游標
v_sql varchar2(500);
v_zj varchar2(10);
begin
dbms_output.enable(buffer_size=>null);
for v_bscl_mc_cur in bscl_mc_cur loop
v_sql := 'SELECT zj,ZJ_DM FROM ecm_bscl_common_content_data d WHERE d.bscl_mc = '||chr(39)||v_bscl_mc_cur.bscl_mc||chr(39); --引號,記得加
dbms_output.put_line('=========='||v_bscl_mc_cur.bscl_mc);
open cur_zj_rows for v_sql;
LOOP
FETCH cur_zj_rows INTO v_zj; --獲取值
EXIT WHEN cur_zj_rows%NOTFOUND; --判斷是否存在值
dbms_output.put_line(v_zj); --操作
END LOOP;
end loop;
end;
————————————————
版權聲明:本文為CSDN博主「紫葉溪」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/a876030877/java/article/details/79923410


免責聲明!

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



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