當我們執行dml或select into時,pl/sql引擎會為我們宣告乙個隱式游標並管理這個游標
之所以謂之「隱式」是因為和游標相關的工作資料庫已經替我們自動做好了
我們使用隱式游標,實際就是期待返回一行,這裡有乙個原則:
對於單行記錄查詢,我們應該總是將它封裝到乙個位於包裡的函式,把這個查詢隱藏在乙個函式介面後面,然後用return語句返回資料
隱式游標是具有下面這些特殊性質的select語句:
① 這個select語句出現在**塊中的執行單元,而顯示游標是在宣告單元定義
② 查詢帶有into語句(批量處理則是bulk collect into)
③ 我們不必開啟、提取或者關閉select語句,所有這些操作都是由資料庫替我們完成
隱式查詢的通常結構:
select column_list [bulk collect] into pl/sql variable_list
雖然資料庫自動替我們執行開啟、提取、關閉等操作,但我們還是可以通過隱式游標的屬性值獲得最近執行的sql語句的資訊
㈠ 隱式游標的例子
隱式游標的常見用法是根據主鍵進行查詢
下面這個例子使用查詢把一行資訊取到乙個記錄中
表:customers
主鍵:cust_id
declare
l_customer customers%rowtype;
begin
select * into l_customer from customers where cust_id=1;
end;
對於這種單行查詢,根據上面的原則,我們通常會將它們隱藏在函式介面後面
如果我們要獲取的資訊多於一行,我們必須為查詢或者使用顯示游標,或者使用bulk collect into語句
㈡ 隱式游標的異常處理
兩種可能異常:
① no_data_found:找不到匹配行
② too_many_rows:返回結果超過一行
作為乙個規則,我們在編寫隱式查詢時總是要帶上no_data_found和too_many_rows異常處理控制代碼
function book_title (isbn_in in books.isbn%type)
return books.title%type
is return_value books.title%type;
begin
select title into return_value from books where isbn=isbn_in;
return return_value;
exception
when no_data_found
then
return null;
when too_many_rows
then
errpkg.record_and_stop('data error: '||isbn_in);
raise;
end;
㈢ 隱式sql的游標屬性
我們可以通過游標的屬性去訪問最近執行的sql資訊
如果會話還沒有執行過隱式游標,所有的隱式游標屬性都會返回null
否則,返回的就是最後一次執行的sql語句的屬性值,而不管這個sql在哪個**塊或程式中執行
要想確保檢查的確實是正確sql語句的屬性值,我們應該在該sql語句執行之後立即把屬性值儲存到區域性變數中
procedure show_book_count
isl_count pls_integer;
l_numfound pls_integer;
begin
select count(*) into l_count from books
--對屬性值作乙個快照
l_numfound := sql%rowcount;
update books set ....
dbms_output.putline(l_numfound);
end;
對顯式游標 隱式游標的理解
顯式游標主要是用於對查詢語句的處理,尤其是在查詢結果為多條記錄的情況下。1 建立測試表,插入 測試資料 2 編寫儲存過程 create or replace procedure printstudent sname in out varchar,sage in varchar as resultco...
游標的定義 顯示游標 隱式游標語法
游標的定義 1.顯示游標 普通顯示游標 帶引數 cursor c pi month varchar2,file type varchar2 is select item id,item title from item where month id pi month 不帶引數 cursor c is ...
ORACLE顯示游標和隱式游標的區別
隱式游標是oracle為所有操縱語句 包括只返回單行資料的查詢語句 自動宣告和操作的一種游標,顯式游標是由使用者宣告和操作的一種游標。顯式游標操作過程主要包括 宣告游標,開啟游標,提取游標,關閉游標。宣告格式 cursor cursor name arg1 arg1 datatype arg2 ar...