PLSql之遊標(cursor)重點
(一)遊標(cursor):在 PL/SQL 程式中,對於處理多行記錄的事務經常使用遊標來實現。
在PL/SQL塊中執行SELECT、INSERT、DELETE和UPDATE語句時,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步驟:
l 定義/宣告遊標:就是定義一個遊標名,以及與其相對應的SELECT 語句。
格式:
CURSOR[RETURN datatype]IS
select_statement;
遊標引數只能為輸入引數,其格式為:
parameter_name [IN] datatype [{:= | DEFAULT} expression]在指定資料型別時,不能使用長度約束。如NUMBER(4),CHAR(10) 等都是錯誤的。
[RETURN datatype]是可選的,表示遊標返回資料的資料。如果選擇,則應該嚴格與select_statement中的選擇列表在次序和資料型別上匹配。一般是記錄資料型別或帶“
l 開啟遊標:就是執行遊標所對應的SELECT 語句,將其查詢結果放入工作區,並且指標指向工作區的首部,標識遊標結果集合。如果遊標查詢語句中帶有FOR UPDATE選項,OPEN 語句還將鎖定資料庫表中游標結果集合對應的資料行。
格式:
OPEN cursor_name[([parameter =>] value[, [parameter =>] value]…)];在向遊標傳遞引數時,可以使用與函式引數相同的傳值方法,即位置表示法和名稱表示法。PL/SQL 程式不能用OPEN 語句重複開啟一個遊標。
l 提取遊標資料:就是檢索結果集合中的資料行,放入指定的輸出變數中。
格式:
FETCH cursor_name INTO {variable_list | record_variable };執行FETCH語句時,每次返回一個數據行,然後自動將遊標移動指向下一個資料行。當檢索到最後一行資料時,如果再次執行FETCH語句,將操作失敗,並將遊標屬性%NOTFOUND置為TRUE。所以每次執行完FETCH語句後,檢查遊標屬性%NOTFOUND就可以判斷FETCH語句是否執行成功並返回一個數據行,以便確定是否給對應的變數賦了值。
l 對該記錄進行處理;
l 繼續處理,直到活動集合中沒有記錄;
l 關閉遊標:當提取和處理完遊標結果集合資料後,應及時關閉遊標,以釋放該遊標所佔用的系統資源,並使該遊標的工作區變成無效,不能再使用FETCH 語句取其中資料。關閉後的遊標可以使用OPEN 語句重新開啟。
格式:
CLOSE cursor_name;注:定義的遊標不能有INTO 子句。
declarecursor 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)--Cointrader之Temporal實體(5)
eas 建表 times create bject cloud temp 存儲 時間 轉載須要註明:http://blog.csdn.net/minimicall,http://cloudtrader.top/ 這一小節說明一個時間實體Temporal實體,它的代碼非常
程序猿的量化交易之路(28)--Cointrader之Offer報價實體(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 數據結構之dict(2)
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源碼分析之NameNode(2)————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源碼之AST(2)
png 變量聲明 enc 標簽 ons directive option 復雜 html 上一節獲取到了DOM樹的字符串,準備進入compile階段: // Line-9326 function compileToFunctions(template,