程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> cursor,cursor是什麼意思

cursor,cursor是什麼意思

編輯:Oracle教程

cursor,cursor是什麼意思


cursor

 

一、分類:

靜態游標  

  顯式游標(需要明確定義)  

   隱式游標(所有dml語句都為隱式游標,for循環也是隱式游標)

ref游標 (盡量不用ref游標,ref游標可在程序間傳遞數據集)  

  強類型ref游標(定義中有返回值)  

  弱類型ref游標(定義中無返回值)

 

二、游標的幾個狀態值:(%前接游標類型的變量)

%found

%notfound

%isopen

%rowcount:當前游標遍歷到的行值

 

三、粗暴的定義:用於遍歷查詢結果集,從而依次對結果集中的行做出相關操作;

 

四、各種游標簡單實例

 

--顯式游標----------------------
--loop循環
declare 
  cursor test_cursor is select * from dept;
  test_ dept%rowtype;--也可寫為test_ test_cursor%rowtype;【此時test_cursor被看做一個結果集?】
begin
  if test_cursor%isopen
     then close test_cursor;
  end if;
  open test_cursor;
  loop
       fetch test_cursor into test_;
       exit when test_cursor%notfound;
       dbms_output.put_line(test_.deptno);
  end loop;
  dbms_output.put_line(test_cursor%rowcount);
  close test_cursor;
end;

--隱式游標----------------------
--for循環
declare 
  cursor test_cursor is select * from dept;
  --test_ test_cursor%rowtype;--這一段可忽略,游標變量在for循環中可直接使用,可不需要定義
begin
  for test_ in test_cursor
    loop
        dbms_output.put_line(test_.loc);
    end loop;
end;
/*
注:
    for游標可不定義游標類型變量
    for後接的就是游標類型變量
*/       
   
--DML(update,insert,delete)
begin
  update test_trans01 set b=111 where a='a';
  if sql%rowcount<>0 then
    dbms_output.put_line(sql%rowcount||'行被更新!');
  end if;
end;

--強類型ref游標----------------------
declare
  type test_cursor is ref cursor return test_trans01%rowtype;
  test_ test_cursor;
  test__ test_%rowtype;
begin
  open test_ for select * from test_trans01;
  loop
       fetch test_ into test__;
       exit when test_%notfound;
       dbms_output.put_line(test__.a);
  end loop;
  close test_;
end;

--弱類型ref游標----------------------
declare
  type test_cursor is ref cursor;
  test_ test_cursor;
  --test__ test_%rowtype;【這樣應用會報錯】
  test__ dept%rowtype;
begin
  open test_ for select * from dept;
  loop
       fetch test_ into test__;
       exit when test_%notfound;
       dbms_output.put_line(test__.dname);
  end loop;
  close test_;
end;

--應用實例----------------------
--for update/delete【用於修改或刪除表中數據】
declare
      cursor test_cursor is select * from test_trans01 for update;--
begin
  for test_ in test_cursor
    loop
      dbms_output.put_line(test_.a);
      if test_.a='a' then
        update test_trans01 set b=1111 where current of test_cursor;
        dbms_output.put_line(test_.a||'被更新!');
      else null;
      end if;
    end loop;
end;

--帶參數的顯示游標
--暫時未發現可用之處,或許可用在復雜的語句塊中,接收條件判定生成的參數,但講參數直接寫在where後是一樣的效果。。?
declare
    cursor test_cursor(dd number :=2) is select * from test_trans01 where b>dd;--參數變量不能限定范圍
    test_ test_cursor%rowtype;
begin
    open test_cursor;
    loop
         fetch test_cursor into test_;
         exit when test_cursor%notfound;
         dbms_output.put_line(test_.b);
    end loop;
    close test_cursor;
end; 

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved