oracle會建立乙個儲存區域,被稱為上下文區域,用於處理sql語句,其中包含需要處理的語句,例如所有的資訊,行數處理,等等。
游標是指向這一上下文的區域。 pl/sql通過控制游標在上下文區域。游標持有的行(乙個或多個)由sql語句返回。行集合游標保持的被稱為活動集合。
可以命名乙個游標,它可以在程式中獲取和處理sql語句,一次返回的行引用。有兩種型別的游標:
隱式游標
顯式游標
隱式游標
oracle在乙個sql語句的執行,當沒有顯式游標的語句隱式游標時自動建立。程式設計師無法控制隱式游標其中的資訊。
每當發出乙個dml語句(insert,update和delete),隱式游標與此語句關聯。對於insert操作時,游標保持乙個需要插入的資料。對於update和delete操作,游標標識會受到影響的行。
在pl/sql,可以參考最近的隱式游標的sql游標,它有類似%found,%isopen,%notfound,和%rowcount屬性。在sql游標有額外的屬性,%bulk_rowcount和%bulk_exceptions,設計用於所有語句中使用。下表提供了最常用的屬性的描述:
屬性描述
%found
返回true如果乙個insert,update或delete語句影響了一行或多行或select into語句返回一行或多行。否則,它將返回false。
%notfound
邏輯相反%found。返回true如果乙個insert,update或delete語句影響沒有行或select into語句返回任何行。否則,它將返回false。
%isopen
隱式游標總是返回false,因為oracle執行其相關的sql語句之後自動關閉sql游標。
%rowcount
返回受insert,update影響的行數,或delete語句,或者通過乙個select into語句返回。
任何sql游標屬性將被訪問,sql%attribute_name如示例圖所示。
例子:這裡使用我們已經建立,並在前面的章節中使用的customers表。
select*fromcustomers;+----+----------+-----+-----------+----------+|id |name |age |address |salary |+----+----------+-----+-----------+----------+|1|ramesh|32|ahmedabad|2000.00||2|khilan|25|delhi|1500.00||3|kaushik |23|kota|2000.00||4|chaitali|25|mumbai|6500.00||5|hardik|27|bhopal|8500.00||6|komal|22|mp |4500.00|+----+----------+-----+-----------+----------+
下面的程式將更新表,並通過每個客戶的薪水增加500和使用sql%rowcount屬性來確定受影響的行數:
declare
total_rows number(2);beginupdate customers
set salary =salary +500;if sql%notfound then
dbms_output.put_line('no customers selected');elsif sql%found then
total_rows :=sql%rowcount;dbms_output.put_line(total_rows ||' customers selected ');endif;end;/
當上述**在sql提示符執行時,它產生了以下結果:
6 customers selected
pl/sql procedure successfully completed.
如果檢視customers表中的記錄,會發現各行已更新:
select*fromcustomers;+----+----------+-----+-----------+----------+|id |name |age |address |salary |+----+----------+-----+-----------+----------+|1|ramesh|32|ahmedabad|2500.00||2|khilan|25|delhi|2000.00||3|kaushik |23|kota|2500.00||4|chaitali|25|mumbai|7000.00||5|hardik|27|bhopal|9000.00||6|komal|22|mp |5000.00|+----+----------+-----+-----------+----------+
顯式游標
顯式游標是程式設計師定義游標獲得更多的控制權的上下文的區域。顯式游標應在pl/sql塊的宣告部分中定義。這是建立乙個select語句返回多行。
建立顯式游標語法是:
cursor cursor_name is select_statement;
使用顯式游標的工作包括四個步驟:
宣告游標用於初始化在儲存器
開啟游標分配記憶體
獲取游標檢索資料
關閉游標釋放分配的記憶體
宣告游標
cursor c_customers is
select id,name,address from customers;
開啟游標
開啟游標游標分配記憶體,使得它準備取的sql語句轉換成它返回的行。例如,我們將開啟上述定義的游標如下:
open c_customers;
獲取游標
獲取游標涉及一次訪問一行。例如,將獲取行從上面開啟的游標,如下所示:
fetch c_customers into c_id,c_name,c_addr;
關閉游標
關閉游標來釋放分配的記憶體。例如,將關閉前面開啟的游標,如下所示:
close c_customers;
例子:下面是乙個完整的例子來說明明確游標的概念:
declare
c_id customers.id%type;c_name customers.name%type;c_addr customers.address%type;cursor c_customers isselect id,name,address from customers;beginopen c_customers;loop
fetch c_customers intoc_id,c_name,c_addr;exit when c_customers%notfound;dbms_output.put_line(c_id ||' '||c_name ||' '||c_addr);endloop;close c_customers;end;/
當上述**在sql提示符執行時,它產生了以下結果:
1 ramesh ahmedabad
2 khilan delhi
3 kaushik kota
4 chaitali mumbai
5 hardik bhopal
6 komal mp
pl/sql procedure successfully completed.
SQL SERVER 宣告游標
日期 2005 01 12出處 csdn sql server 宣告游標 每乙個游標必須有四個組成部分這四個關鍵部分必須符合下面的順序 1.declare 游標 2.open 游標 3.從乙個游標中fetch 資訊 4.close 或deallocate 游標 通常我們使用declare 來宣告乙個...
oracle宣告游標和使用游標
使用游標便利員工工資 declare 宣告乙個變數接收員工工資 v sal emp.sal type 宣告乙個變數接收員工編號 v ename emp.ename type 宣告乙個游標 cursor cur name isselect ename,sal from emp 查詢所有員工工資 beg...
oracle存過之游標
游標的最簡單結構是 declare 定義乙個游標 cursor vrows is select from area where parent area 340000 游標的單列 vrow area rowtype begin 開啟游標 open vrows 迴圈 loop 注入,相當於for迴圈 f...