游標分類
游標概念
與游標相關的語法型別
建立游標
—如同宣告任何其他變數一樣
cursor cursor_name is sql_statement;
開啟與關閉游標
開啟游標
open cursor
[arg [, arg … ]];
關閉游標
close cursor;
取資料
fetch cursor into
variable
[, variable
];
游標屬性
通過這些屬性,可以用於考察和了解游標在任何時刻的狀態,從而來決定應用程式的程式結構或程式流程。
cursor_name.attribute_name
比如:查詢所有員工以前在某個工作崗位上的工作時間。
步驟:
》宣告變數
》宣告游標
》開啟游標
》取資料
》資源釋放(關閉游標)
》執行
注意
create
or replace procedure
promotion_review_1
isnemployeeid
number;
dstartdate date;
denddate date;
sjobid varchar2 (20);
*cursor cselectjob
isselect employee_id, start_date, end_date, job_id from hr.job_history;*//游標宣告
begin
open cselectjob;//開啟游標
loop
fetch cselectjob into nemployeeid, dstartdate, denddate, sjobid;
exit when cselectjob%notfound;//訪問游標屬性,決定如何結束
dbms_output.put_line ( 'employee ' || nemployeeid || ' had job ' || sjobid || ' for ' || (denddate - dstartdate) || ' days.' );
endloop;
close cselectjob;//關閉游標,釋放資源
end;
兩種特殊的資料型別
用法 %type
variable_name table.column%type
%rowtype
variable_name table%rowtype
可以直接訪問各個列的值:
row_variable.column_name
不能使用%rowtype資料型別初始化變數
for游標
語法結構:
for record_variable in custor
loop
logic…
endloop;
例項:
create
or replace procedure
promotion_review_2
iscursor
cselectjob
isselect
employee_id, start_date, end_date, job_id
from
hr.job_history;
begin
for jh_rec in cselectjob//迴圈自動執行至結果集中無記錄
loop
dbms_output.put_line ( 'employee ' || jh_rec.employee_id || ' had job ' || jh_rec.job_id || ' for ' || (jh_rec.end_date - jh_rec.start_date) || ' days.' );
endloop;
end;
for游標的好處:
隱式游標
— 前面的例子都是顯式的處理游標,即使用者需要宣告和使用游標。pl/sql允許使用者在不宣告游標的條件下,將sql語句(包括select)用作自己**的一部分。
— 這種情況下,pl/sql使用了一種稱為隱式游標的游標,它在幕後充當一種被宣告的游標(顯式游標)。
— 為了使用隱式游標,只需要簡單地將sql**新增至pl/sql**中。
例項:
create
orreplace
procedure promotion_review_2
is nempno number;
cursor cselectjob
isselect employee_id, start_date, end_date, job_id
from hr.job_history;
begin
//用於開啟游標
select
count(*) into nempno from hr.job_history;
for jh_rec in cselectjob
loop
dbms_output.put_line ( 'employee ' || jh_rec.employee_id || ' had job ' || jh_rec.job_id || ' for ' || (jh_rec.end_date - jh_rec.start_date) || ' days.' );
end loop;
end;
隱式游標和顯示游標的區別:
通過上述例子我們可以看到,隱式游標不能手動的開啟,提取,關閉,在使用select。。into 語句時會自己開啟,提取,建立,關閉。顯示游標在使用時需要通過open語句開啟游標,通過fetch語句獲取游標資料如果有多行,則在迴圈語句中使fetch語句,最後關閉游標
ref游標
type ref_cursor_name is ref cursor
[ return_type];
rc ref_cursor_name;
— 語法中的子句return_type是可選的,可以指定或不指定該ref游標返回的資料型別。
— 如果不指定返回型別,由於該游標是弱型別的,稱之為弱游標;
定義了返回型別的,稱之為強游標。
— 由於弱游標容易導致在由ref游標返回的資料和應用程式所使用的變數之間的型別不匹配,因此弱游標更有可能產生程式設計問題。
Oracle PL SQL 學習筆記
一 pl sql 塊 塊定義語法 declare 定義部分 定義常量 變數 複雜資料型別 游標 begin 執行部分 pl sql語句和sql語句 exception 異常處理部分 處理執行錯誤 end 注 pl sql中結束輸入使用 字元 dbms output.put line 輸出的字串內容 ...
Oracle PL SQL 學習筆記(四)
3.2定義並使用變數 pl sql資料型別 標量 scalar 型別 復合 composite 型別 參照 reference 型別和lob larger object 型別。3.2.1標量變數 1.常用標量型別 1 varchar2 n 定義可變長度的字串,長度 4000位元組 2 char n ...
Oracle PL SQL 學習筆記(二)
二 pl sql 開發工具 2.1sql plus 1.在命令列執行sql plus 語法 sqlplus username password server 其中,username使用者名稱,password密碼,server指定主機字串。當連線到本地資料庫時,不需要提供網路服務名。d sqlplu...