1. 程式人生 > >PLSql之遊標(cursor)重點

PLSql之遊標(cursor)重點

(一)遊標(cursor):在 PL/SQL 程式中,對於處理多行記錄的事務經常使用遊標來實現。

PL/SQL塊中執行SELECTINSERTDELETEUPDATE語句時,ORACLE會在記憶體中為其分配上下文區(Context Area),即緩衝區。遊標是指向該區的一個指標,或是命名一個工作區(Work Area),或是一種結構化資料型別。比較類似於java中迭代器(iterator)。

(二)遊標的型別

1、隱式遊標:在 PL/SQL 程式中執行DML SQL 語句時自動建立隱式遊標,名字固定叫sql。

2、顯式遊標:顯式遊標用於處理返回多行的查詢。
3、REF 遊標:REF 遊標用於處理執行時才能確定的動態 SQL 查詢的結果

一、隱式遊標:
 在PL/SQL中使用DML語句時自動建立隱式遊標,隱式遊標自動宣告、開啟和關閉,其名為 SQL,通過檢查隱式遊標的屬性可以獲得最近執行的 DML 語句的資訊,隱式遊標的屬性有: %FOUND – SQL 語句影響了一行或多行時為 TRUE,%NOTFOUND – SQL 語句沒有影響任何行時為TRUE,%ROWCOUNT – SQL 語句影響的行數,%ISOPEN - 遊標是否開啟,始終為false。

二、顯示遊標

1. 顯式遊標處理

顯式遊標處理需四個 PL/SQL步驟:

定義/宣告遊標:就是定義一個遊標名,以及與其相對應的SELECT 語句。

格式:

CURSOR
 cursor_name[(parameter[, parameter]…)] 
           
[RETURN datatype]IS 
        select_statement;

遊標引數只能為輸入引數,其格式為: 

parameter_name [IN] datatype [{:= | DEFAULT} expression]

在指定資料型別時,不能使用長度約束。如NUMBER(4),CHAR(10等都是錯誤的。

[RETURN datatype]是可選的,表示遊標返回資料的資料。如果選擇,則應該嚴格與select_statement中的選擇列表在次序和資料型別上匹配。一般是記錄資料型別或帶“

%ROWTYPE”的資料。

開啟遊標:就是執行遊標所對應的SELECT 語句,將其查詢結果放入工作區,並且指標指向工作區的首部,標識遊標結果集合。如果遊標查詢語句中帶有FOR UPDATE選項,OPEN 語句還將鎖定資料庫表中游標結果集合對應的資料行。

格式:

OPEN cursor_name[([parameter =>] value[, [parameter =>] value]…)];

在向遊標傳遞引數時,可以使用與函式引數相同的傳值方法,即位置表示法和名稱表示法。PL/SQL 程式不能用OPEN 語句重複開啟一個遊標。

提取遊標資料:就是檢索結果集合中的資料行,放入指定的輸出變數中。 

格式:

FETCH cursor_name INTO {variable_list | record_variable };

執行FETCH語句時,每次返回一個數據行,然後自動將遊標移動指向下一個資料行。當檢索到最後一行資料時,如果再次執行FETCH語句,將操作失敗,並將遊標屬性%NOTFOUND置為TRUE。所以每次執行完FETCH語句後,檢查遊標屬性%NOTFOUND就可以判斷FETCH語句是否執行成功並返回一個數據行,以便確定是否給對應的變數賦了值。

對該記錄進行處理;

繼續處理,直到活動集合中沒有記錄;

關閉遊標:當提取和處理完遊標結果集合資料後,應及時關閉遊標,以釋放該遊標所佔用的系統資源,並使該遊標的工作區變成無效,不能再使用FETCH 語句取其中資料。關閉後的遊標可以使用OPEN 語句重新開啟。

格式:

CLOSE cursor_name;

注:定義的遊標不能有INTO 子句。

declare
   cursor c is
            select * from emp;
   v_temp c%rowtype;
begin
    open c;
    fetch c into v_temp;
    dbms_output.put_line(v_temp.ename);
    close c;
end;


------------------
declare
    cursor c is
       select * from emp;
    v_emp c%rowtype;
begin
    open c;
    loop
      fetch c into v_emp;
      exit when (c%notfound);
      dbms_output.put_line(v_emp.ename);
    end loop;
    close c;
end;
----------------------
declare
    cursor c is
       select * from emp;
    v_emp c%rowtype;
begin
    open c;
    fetch c into v_emp;
    while (c%found) loop
      dbms_output.put_line(v_emp.ename);
      fetch c into v_emp;
    end loop;
    close c;
end;
-----------------

使用遊標建議使用for迴圈(因為for迴圈不用fetch,)
declare
    cursor c is
       select * from emp;
begin
   for v_emp in c loop
        dbms_output.put_line(v_emp.ename);
    end loop;
end;


--帶引數的遊標
declare
   cursor c (v_deptno emp.deptno%type, v_job emp.job%type)
   is
     select ename, sal from emp where deptno = v_deptno and job = v_job;
begin
   for v_temp in c(30,'CLERK') loop
      dbms_output.put_line(v_temp.ename);
   end loop;
end;


--可更新的遊標
declare
  cursor c
  is
    select * from emp2 for update;
begin
   for v_temp in c loop
      if (v_temp.sal < 2000) then
         update emp2 set sal = sal * 2 where current of c;
      elsif (v_temp.sal = 5000) then
         delete from emp2 where current of c;
      end if;
    end loop;
    commit;
end;

--For 循環遊標
--
(1)定義遊標
--
(2)定義遊標變數
--
(3)使用for迴圈來使用這個遊標declare
--型別定義 cursor c_job
is
select empno,ename,job,sal
from emp
where job='MANAGER';
--定義一個遊標變數v_cinfo c_emp%ROWTYPE ,該型別為遊標c_emp中的一行資料型別 c_row c_job%rowtype;
begin
for c_row in c_job loop
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
end loop;
end;



--Fetch遊標
--
使用的時候必須要明確的開啟和關閉
declare
--型別定義 cursor c_job
is
select empno,ename,job,sal
from emp
where job='MANAGER';
--定義一個遊標變數 c_row c_job%rowtype;
begin
open c_job;
loop
--提取一行資料到c_row fetch c_job into c_row;
--判讀是否提取到值,沒取到值就退出 --取到值c_job%notfound 是false --取不到值c_job%notfound 是true exit when c_job%notfound;
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
end loop;
--關閉遊標 close c_job;
end;

參考文件:

相關推薦

PLSql遊標cursor重點

(一)遊標(cursor):在 PL/SQL 程式中,對於處理多行記錄的事務經常使用遊標來實現。 在PL/SQL塊中執行SELECT、INSERT、DELETE和UPDATE語句時,ORACLE會在記

三、存儲過程Stored Procedure遊標Cursor

行數據 exceptio 結構 行數 into 完成 num replace 多個 一、存儲過程   一組為了完成特定功能的SQL語句集,經編譯後存儲在數據庫中,用戶通過指定存儲過程的名字並給出參數,來執行它。 在大型數據庫中,存儲過程和觸發器具有重要的作用。無論是存儲過程

MySQL儲存過程遊標cursor示例

Mysql建立儲存過程,使用遊標Cursor迴圈更新 使用遊標(cursor) 1.宣告遊標 DECLARE cursor_name CURSOR FOR select_statement 這個語句

Oracle中PL/SQL常量和變數的定義、遊標游標的使用

PL/SQL常量和變數的定義 變數的資料型別:char、varchar2、date、number、boolean、long 常量定義:isshow boolean :=true; 說明變數:說明變數名、資料型別和長度後用分號結束說明語句。例:e_name varchar2(20);

Cursor遊標游標的使用

      begin         --for迴圈         for ccrec in cc loop             dbms_output.put_line(ccrec.empno||'-'||ccrec.ename||'-'||ccrec.job||'-'||ccrec.sal);  

python學習

[1] size class dex epc uri msu 語句 這就是 繼續昨天的學習,學到了數組。 首先有兩個數組,name1和name2.我們可以將兩個數組合並 name1=[1,2,3,4] name2=[5,6,7,8] names=name1.extend(

程序猿的量化交易17--CointraderTemporal實體5

eas 建表 times create bject cloud temp 存儲 時間 轉載須要註明:http://blog.csdn.net/minimicall,http://cloudtrader.top/ 這一小節說明一個時間實體Temporal實體,它的代碼非常

程序猿的量化交易28--CointraderOffer報價實體15

content mod min timer warnings ppr extend gets ant 轉載須註明出處:http://blog.csdn.net/minimicall?viewmode=contents,http://cloudtrade.top/ Off

星際

輸出 detail return 技術 gin ace problem pau ans 星際之門(一) 時間限制:3000 ms | 內存限制:65535 KB 難度:3 描寫敘述 公元3000年。子虛帝國統領著N個星系,

F#

簡單 ssi arp compile posit slist change 縮進 類型 寫在前面的話 解答一下在上一篇文章《在Visual Studio中入門F#》中有人的提問,   1. 問:是準備寫 F# 系列嗎?    答:當然不是,本人也是剛剛學習 F#,只是

一個鹹魚的Python爬蟲:爬取網頁圖片

you os.path odin 路徑 生成 存在 parent lose exist 學完Requests庫與Beautifulsoup庫我們今天來實戰一波,爬取網頁圖片。依照現在所學只能爬取圖片在html頁面的而不能爬取由JavaScript生成的圖。所以我找了這個網站

python strip()--轉載

rip class 函數 地址 字符 pre abc blog python 原博地址:http://www.jb51.net/article/37287.htm 函數原型 聲明:s為字符串,rm為要刪除的字符序列 s.strip(rm) 刪除s字符串中開頭、

Redis 數據結構dict2

value ash 每次 earch 定義 索引 user popu adding 本文及後續文章,Redis版本均是v3.2.8 上篇文章《Redis 數據結構之dict》,我們對dict的結構有了大致的印象。此篇文章對dict是如何維護數據結構的做個詳細的理解

spring註解概述

dsm 的人 src article service 優缺點 中一 auto 數據 Spring的核心是依賴註入(DI),而依賴註入的基礎是依賴信息的配置。這些配置稱之為元數據。在之前的的學習中。一直採用的是基於xml的配置,這些元數據配置在spring內部被註冊成為B

HDFS源碼分析NameNode2————Format

return exceptio 數據信息 row oid creat tail 進行 alt    在Hadoop的HDFS部署好了之後並不能馬上使用,而是先要對配置的文件系統進行格式化。在這裏要註意兩個概念,一個是文件系統,此時的文件系統在物理上還不存在,或許是網絡磁盤來

網站權限管理 jue色管理

alt 逗號 ont 清除 ++ function 字符串 b- 如果 公司或網站的正常運行,離不開管理員對各個員工的合理分配,那先看看權限管理中的角色管理好了: 要更改用戶的角色,那麽先來理一下思路: (1)用戶現在是什麽角色? (2)用戶將要成為什麽角色? (3)怎樣更

Coco2d-x 塔防遊戲“賊來了”開發簡檔 完結

遊戲開發 uml 塔防遊戲 賊來了 原來的教程為《塔防遊戲之賊來了》(這是我之前學習Cocos2d-x時候,看到的一個比較好的教程)原文地址目前只在泰然網看到,http://www.tairan.com/archives/6413 ,原作者為任珊。本文是基於這個教程,而編寫的遊戲開發簡檔,有了這些圖表,

css重構

rdquo lan set 變化 部分 網站 一個 寬度 lang css重構之旅 >前言: 今年我大一,馬上就要大二了。從高三畢業暑假到大學的這一年馬上過去,馬上迎來大二生活.學習前端也有將近一年了。一昧去追求那些視覺的效果和相對高端和新穎的技術,反而忽略了最基礎

深入學習mysql表的操作

uniq order fault change incr 相關 約束 設置 type 1、表:是數據庫中的存儲數據的基本單位,一個表包含若幹個字段和值 2、創建表:   CREATE TABLE 表名稱 (   字段名1  數據庫類型1  [約束條件1],   字段名2  

.6-Vue源碼AST2

png 變量聲明 enc 標簽 ons directive option 復雜 html   上一節獲取到了DOM樹的字符串,準備進入compile階段: // Line-9326 function compileToFunctions(template,