Oracle PL SQL學習筆記

2021-07-14 04:55:29 字數 3682 閱讀 9613

游標分類

游標概念

與游標相關的語法型別

建立游標

—如同宣告任何其他變數一樣

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...