Oracle中Cursor 游標 學習

2021-08-31 01:58:10 字數 4156 閱讀 8322

一  概念

游標是sql的乙個記憶體工作區,由系統或使用者以變數的形式定義。游標的作用就是用於臨時儲存從資料庫中提取的資料塊。在某些情況下,需要把資料從存放在磁碟的表中調到計算機記憶體中進行處理,最後將處理結果顯示出來或最終寫回資料庫。這樣資料處理的速度才會提高,否則頻繁的磁碟資料交換會降低效率。

二  型別

cursor型別包含三種: 隱式cursor,顯式cursor和ref cursor(動態cursor)。

1. 隱式cursor:

1).對於select …into…語句,一次只能從資料庫中獲取到一條資料,對於這種型別的dml sql語句,就是隱式cursor。例如:select /update / insert/delete操作。

2)作用:可以通過隱式cusor的屬性來了解操作的狀態和結果,從而達到流程的控制。cursor的屬性包含:

sql%rowcount 整型 代表dml語句成功執行的資料行數

sql%found  布林型  值為true代表插入、刪除、更新或單行查詢操作成功

sql%notfound 布林型 與sql%found屬性返回值相反

sql%isopen 布林型 dml執行過程中為真,結束後為假

3) 隱式cursor是系統自動開啟和關閉cursor.

下面是乙個sample:

sql**

set serveroutput on;  

begin 

update t_contract_master set liability_state = 1 where policy_code = '123456789';  

if sql%found then 

dbms_output.put_line('the policy is updated successfully.');  

commit;  

else 

dbms_output.put_line('the policy is updated failed.');  

end if;  

end;  

/  set serveroutput on;

begin

update t_contract_master set liability_state = 1 where policy_code = '123456789';

if sql%found then

dbms_output.put_line('the policy is updated successfully.');

commit;

else

dbms_output.put_line('the policy is updated failed.');

end if;

end;

/在pl/sql中run:

sql**

sql>   

the policy is updated failed.  

pl/sql procedure successfully completed 

sql>

the policy is updated failed.

pl/sql procedure successfully completed

2. 顯式cursor:

(1) 對於從資料庫中提取多行資料,就需要使用顯式cursor。顯式cursor的屬性包含:

游標的屬性   返回值型別   意    義 

%rowcount   整型  獲得fetch語句返回的資料行數 

%found  布林型 最近的fetch語句返回一行資料則為真,否則為假 

%notfound   布林型 與%found屬性返回值相反 

%isopen 布林型 游標已經開啟時值為真,否則為假 

set serveroutput on;

set serveroutput on;

set serveroutput on;

/run pl/sql,執行結果如下:

sql**

sql>   

8780203932  

8780203227  

8780203218  

8771289268  

pl/sql procedure successfully completed 

set serveroutput on;

end;

/4.常見exception

sql**

1.  錯 誤 名 稱 錯誤**    錯 誤 含 義     

2.  cursor_already_open ora_06511   試圖開啟已經開啟的游標     

3.  invalid_cursor  ora_01001   試圖使用沒有開啟的游標     

4.  dup_val_on_index    ora_00001   儲存重複值到惟一索引約束的列中     

5.  zero_divide ora_01476   發生除數為零的除法錯誤     

6.  invalid_number  ora_01722   試圖對無效字元進行數值轉換     

7.  rowtype_mismatch    ora_06504   主變數和游標的型別不相容     

8.  value_error ora_06502   轉換、截斷或算術運算發生錯誤     

9.  too_many_rows   ora_01422   select…into…語句返回多於一行的資料     

10. no_data_found   ora_01403   select…into…語句沒有資料返回     

11. timeout_on_resource ora_00051   等待資源時發生超時錯誤     

12. transaction_backed_out  ora_00060   由於死鎖,提交失敗     

13. storage_error   ora_06500   發生記憶體錯誤     

14. program_error   ora_06501   發生pl/sql內部錯誤     

15. not_logged_on   ora_01012   試圖操作未連線的資料庫     

16. login_denied    ora_01017   在連線時提供了無效使用者名稱或口令   

1. 錯 誤 名 稱 錯誤**    錯 誤 含 義  

2. cursor_already_open ora_06511   試圖開啟已經開啟的游標  

3. invalid_cursor  ora_01001   試圖使用沒有開啟的游標  

4. dup_val_on_index    ora_00001   儲存重複值到惟一索引約束的列中  

5. zero_divide ora_01476   發生除數為零的除法錯誤  

6. invalid_number  ora_01722   試圖對無效字元進行數值轉換  

7. rowtype_mismatch    ora_06504   主變數和游標的型別不相容  

8. value_error ora_06502   轉換、截斷或算術運算發生錯誤  

9. too_many_rows   ora_01422   select…into…語句返回多於一行的資料  

10. no_data_found   ora_01403   select…into…語句沒有資料返回  

11. timeout_on_resource ora_00051   等待資源時發生超時錯誤  

12. transaction_backed_out  ora_00060   由於死鎖,提交失敗  

13. storage_error   ora_06500   發生記憶體錯誤  

14. program_error   ora_06501   發生pl/sql內部錯誤  

15. not_logged_on   ora_01012   試圖操作未連線的資料庫  

16. login_denied    ora_01017   在連線時提供了無效使用者名稱或口令 

Oracle中游標Cursor的介紹

游標就是為了不頻繁訪問磁碟而存在的東西。就好像redis一樣,類似於乙個快取。游標 定義游標 cursor cursor name is 開啟游標 open cursor name 運算元據 fetch cursor name set serveroutput on declare define c...

oracle 游標cursor詳解

一 概念 游標是sql的乙個記憶體工作區,由系統或使用者以變數的形式定義。游標的作用就是用於臨時儲存從資料庫中提取的資料塊。在某些情況下,需要把資料從存放在磁碟的表中調到計算機記憶體中進行處理,最後將處理結果顯示出來或最終寫回資料庫。這樣資料處理的速度才會提高,否則頻繁的磁碟資料交換會降低效率。二 ...

oracle 游標操作,cursor

在游標中使用引數 cursor cursor name p state in state type is select statement 沒有引數的寫法是 cursor cursor name is select statement 對於括號裡面的,in 左邊是引數的別名,in 右邊是引數的型別,...