orcale 之遊標的屬性
無論是顯式遊標還是隱式遊標都會有四個屬性分別是:%ISOPEN、%FOUND、%NOTFOUND、%ROWCOUNT
下面我們分別對著幾種屬性進行分析。
%FOUND
該屬性表示當前遊標是否指向有效的一行,結果是一個Boolean
型別的。這個屬性一般用來判斷是否結束當前遊標的使用。
OPEN emp_cur; --開啟遊標
--將第一行的資料放入變數中,之後遊標後移
FETCH emp_cur INTO emp_no, emp_nanme;
LOOP
EXIT WHEN NOT emp_cur%FOUND; --如果遊標已經到末尾結束
IF emp_no = '7839' THEN
INSERT INTO t_emp values(emp_no,emp_nanme);
else
INSERT INTO t_emp2 values(emp_no,emp_nanme);
END IF;
FETCH emp_cur INTO emp_no, emp_nanme;
END LOOP;
CLOSE emp_cur; --關閉遊標
在隱式遊標中引用方法為 SQL%FOUND
。
delete from student where sid = 1;
if SQL%FOUND THEN
INSERT INTO states values(1,1);
else
INSERT INTO states values(1,0);
end if;
%NOTFOUND
這個屬性和上面的 %FOUND
很類似,只不過結果相反。這裡就不舉例子了,大家自己練習下。
%ROWCOUNT
這個屬性記錄了遊標取過記錄的行數,也可以理解為當前遊標所在的行數。這個屬性在迴圈的時候十分有效。
LOOP
FETCH emp_cur INTO emp_no, emp_nanme;
EXIT WHEN emp_cur%ROWCOUNT=10;
...
END LOOP;
在隱式遊標中使用 %ROWCOUNT
%ISOPEN
顧名思義是表示遊標是否處於開啟的狀態。在我們的實際使用前最好使用該屬性進行檢查。
IF emp_cur%ISOPEN THEN
FETCH emp_cur INTO emp_no, emp_nanme;
ELSE
OPEN emp_cur
END IF;
在隱式遊標中可以使用 SQL%ISOPEN
進行引用,但是需要說的是隱式遊標中 SQL%ISOPEN
總是為 TRUE
因此隱式遊標中不需要開啟遊標關閉遊標,也不需要對遊標的狀態進行檢查。
oracle中的sql%found
、sql%notfound
、sql%rowcount
和sql%isopen
Oracle 儲存過程 刪除表記錄時刪除不存在的記錄也是顯示刪除成功
create or replace procedure delDept(p_deptno in dept.deptno%type) is
begin
delete from dept where deptno=p_deptno;
dbms_output.put_line('部門刪除成功...');
exception when others then
dbms_output.put_line('部門刪除失敗...');
end;
刪除不存在的資料並不會促發Oracle的異常
對於delete from dept where deptno=p_deptno;
判斷是否有資料被刪除可以用sql%rowcount
,sql%notfound
來判斷
if sql%rowcount = 0 then
dbms_output.put_line('部門刪除失敗...');
end if;
或者
if sql%notfound then
dbms_output.put_line('部門刪除失敗...');
end if;
create or replace procedure delDept(p_deptno in dept.deptno%type) is
EmpCount NUMBER; --影響的記錄數
begin
delete from dept where deptno=p_deptno;
EmpCount := SQL%ROWCOUNT;
if(EmpCount <>0)
then
dbms_output.put_line('部門刪除成功...');
exception when others then
dbms_output.put_line('部門刪除失敗...');
end;
sql%rowcount
用於記錄修改的條數,就如你在sqlplus
下執行delete from
之後提示已刪除xx行一樣,這個引數必須要在一個修改語句和commit
之間放置,否則你就得不到正確的修改行數。
例如:
SQL> declare n number;
2 begin
3 insert into test_a select level lv from dual connect by level<500;
4 n:=sql%rowcount;
5 commit;
6 dbms_output.put_line(n);
7 end;
8 /
如果我連續執行了3個select
語句
然後呼叫sql%rowcount
,得到的結果是最後一個select
的條數。 要統計所有的,可以使用三個變數接收sql%rowcount
,然後相加即可,不過貌似直接select
的寫法無法使用sql%rowcount
。
在執行DML
(insert,update,delete
)語句時,可以用到以下三個隱式遊標(遊標是維護查詢結果的記憶體中的一個區域,執行DML
時開啟,完成時關閉,用sql%isopen
檢查是否開啟):
sql%found
(布林型別,預設值為null
)
sql%notfound
(布林型別,預設值為null
)
sql%rowcount
(數值型別預設值為0
)
sql%isopen
(布林型別)
當執行一條DML語句後,DML
語句的結果儲存在四個遊標屬性中,這些屬性用於控制程式流程或者瞭解程式的狀態。當執行DML語句時,PL/SQL
開啟一個內建遊標並處理結果,遊標是維護查詢結果的記憶體中的一個區域,遊標在執行DML
語句時開啟,完成後關閉。隱式遊標只使用SQL%FOUND
,SQL%NOTFOUND
,SQL%ROWCOUNT
三個屬性.SQL%FOUND
,SQL%NOTFOUND
是布林值,SQL%ROWCOUNT
是整數值。
SQL%FOUND
和SQL%NOTFOUND
在執行任何DML語句前SQL%FOUND
和SQL%NOTFOUND
的值都是NULL
,在執行DML語句後,SQL%FOUND
的屬性值將是:
- TRUE :
INSERT
- TRUE :
DELETE
和UPDATE
,至少有一行被DELETE
或UPDATE
. - TRUE :
SELECT INTO
至少返回一行
當SQL%FOUND
為TRUE
時,SQL%NOTFOUND
為FALSE
。
SQL%ROWCOUNT
在執行任何DML語句之前,SQL%ROWCOUNT
的值都是NULL
,對於SELECT INTO
語句,如果執行成功,SQL%ROWCOUNT
的值為1
,如果沒有成功或者沒有操作(如update、insert、delete
為0條),SQL%ROWCOUNT
的值為0.
SQL%ISOPEN
SQL%ISOPEN
是一個布林值,如果遊標開啟,則為TRUE
, 如果遊標關閉,則為FALSE
.對於隱式遊標而言SQL%ISOPEN
總是FALSE
,這是因為隱式遊標在DML語句執行時開啟,結束時就立即關閉。
no_data_found
與sql%notfound
以及sql%rowcount
的區別:
NO_DATA_FOUND
:該異常可以在兩種不同的情況下出現:第一種:當SELECT。。。。INTO
語的 WHERE
子句 沒匹配任何資料行時;第二種:試圖引用尚未賦值的PL/SQL index-by
表元素時。
SQL%NOTFOUND
:是隱匿遊標的屬性,當沒有可檢索的資料時,該屬性為:TRUE
;常作為檢索迴圈退出的條件。若某UPDATE
或DELETE
語句的WHERE子句不匹配任何資料行,該屬性為:TRUE
,但不併不出現NO_DATA_FOUND
異常.
SQL%ROWCOUNT
:該數字屬性返回了到目前為止,遊標所檢索資料庫行的個數。
相關文章
- CMake 屬性之目標屬性
- CMake 屬性之全域性屬性
- CMake 屬性之目錄屬性
- HTML標籤屬性HTML
- HTML 常用的標籤和屬性HTML
- <checkBox>標籤的value屬性的作用
- input標籤autocomplete 屬性
- WPF 之 依賴屬性與附加屬性(五)
- xss標籤和屬性爆破
- Vue 標籤中的ref屬性和refsVue
- Python深入分享之物件的屬性Python物件
- HTML 標籤與屬性大小寫HTML
- 標籤上title與alt屬性的區別
- script標籤的defer和async屬性詳解
- 正值表示式匹配html標籤的屬性值HTML
- C#裡面標籤的屬性和事件C#事件
- quotes屬性與<q>標籤關係
- html標籤中的lang屬性有什麼作用?HTML
- HTML DOM之document物件的屬性和方法HTML物件
- 課時26.a標籤其它屬性(掌握)
- vue 標籤和屬性中 字串拼接方法Vue字串
- 內嵌標籤frameset框架屬性及用法框架
- Python 類的屬性與例項屬性Python
- jQuery屬性操作之.val()函式jQuery函式
- 淺談WPF之屬性系統
- Android 動畫之屬性動畫Android動畫
- CSS之定位和堆疊屬性CSS
- [java IO流]之 Properties屬性集Java
- css基礎02-操作文字屬性、背景屬性、補充知識(去掉列表的前標、列表CSS
- a標籤的使用,以及一些全域性屬性和連結型別。型別
- 【spring原始碼系列】之【Bean的屬性賦值】Spring原始碼Bean賦值
- defer 屬性和 async 屬性
- logback 的屬性
- java的兩個bean之間複製屬性,所有屬性中替換某幾個字元JavaBean字元
- ESLint對a標籤href屬性警告解決方法EsLint
- link標籤的屬性media有哪些值?都有什麼作用?
- HCNP Routing&Switching之BGP團體屬性和團體屬性過濾器過濾器
- Hive學習之常見屬性配置Hive