1. 程式人生 > >%notfound的理解——oracle儲存過程

%notfound的理解——oracle儲存過程

 文件中的解釋:It returns TRUE if an INSERT, UPDATE, or DELETE statement affected no rows, or a SELECT INTO statement returned no rows. Otherwise, it returns FALSE.
這個解釋更加精妙:
%NOTFOUND is the logical opposite of %FOUND. %NOTFOUND yields FALSE if the last fetch returned a row, or TRUE if the last fetch failed to return a row
錯誤的例子:
tableA
id  name
1   a
2   b

declare
cursor v_cur is

select name from tableA;

n varchar2(10);
begin
open v_cur;
loop
exit when v_cur%notfound;
fetch v_cur into n;

dbms_output.put_line(n);

close v_cur;
end loop;

end;
執行上面的語句,結果為:
a
b
b
發現最後一條記錄被列印了兩次。原因是%notfound是判斷最後一次fetch的結果,把bfetch到變數n中之後再執行exit when %notfound判斷得到的是false的記過,也就是說是有返回行的,所以判斷通過,再此執行了列印語句。
發現了另一個疑問:
把a,b都fetch之後按理說遊標已經空了,那麼第三次應該是fetch的空值,為什麼打印出來的還是b呢??
因為fetch..into語句末尾不會修改into變數後面的值。就像select..into如果沒有資料會報異常,但是不會把into後面的變數置為空
再寫一段程式碼

declare
cursor v_cur is

select name from tableA where name = 'c';

n varchar2(10);
begin
open v_cur;
loop
exit when v_cur%notfound;

n:='hehe'
fetch v_cur into n;

dbms_output.put_line(n);

close v_cur;
end loop;

end;
執行程式碼的結果:
hehe
疑問:遊標是空遊標,也就是說遊標在開啟的時候就沒有指向任何的值。但為什麼
exit when v_cur%notfound;這條語句還通過了呢??
oracle文件的解釋:

Before the first fetch, %NOTFOUND

returns NULL. If FETCH never executes successfully, the loop is never exited, because the EXIT WHEN statement executes only if its WHEN condition is true. To be safe, you might want to use the following EXIT statement instead:

EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL;

也就是說v_cur%notfound有三種狀態,true,false,null。所以以後為了安全期間可以加上是否為空的判斷

相關推薦

%notfound理解——oracle儲存過程

 文件中的解釋:It returns TRUE if an INSERT, UPDATE, or DELETE statement affected no rows, or a SELECT INTO statement returned no rows. Otherwise

Oracle儲存過程及引數理解 引數預設值 引數順序

Oracle儲存過程及引數理解 (2010-11-12 11:23:34)  轉自:http://blog.sina.com.cn/s/blog_45daee4a0100n9ar.html 一、過程 (儲存過程)     過程是一個能執行某個特定操作的子程式。使用CRE

Oracle儲存過程的簡單舉例

一、建立測試資料 --建立測試資料: create table person(編號 number(10),姓名 varchar2(20),密碼 varchar2(20)); insert into person values(1,'xzw','888'); select * from p

Oracle儲存過程例項分析總結(程式碼)

1.儲存過程結構 1.1 第一個儲存過程 ? 1 2 3 4

java面試問題:oracle儲存過程(procedure)和函式(function)的區別

oracle儲存過程(procedure)和函式(function)的區別 儲存過程 函式 用於在資料庫中完成特定的操作或者任務(如插入、刪除等) 用於特定的資料(如選擇)

Oracle儲存過程基礎內容

1 基本語法 1.1 無參無變數 create or replace procedure firstPro as begin dbms_output.put_line('hello word, my name is stored procedure'); end;

oracle 儲存過程 例項 迴圈 給查詢賦值 遊標取值

CREATE OR REPLACE PROCEDURE p_updete_gs is     --僅供參考   i_jdid varchar(32);   i_ryid varchar(32);   cursor cur is --

C#呼叫ORACLE儲存過程返回結果集

Oracle中scott使用者下建立儲存過程: (注:從9i開始有了sys_refcursor這種型別,在以前的Oracle版本中需要使用REF CURSOR,並且還需放在一個程式包中) create or replace procedure sp_getdept (result

Oracle儲存過程學習筆記(一)

SQL是一種語言! 一、先看一部分基礎: 也可參考該文章:https://www.cnblogs.com/Singleorb/p/6217268.html; 1、語法  CREATE OR REPLACE PROCEDURE 儲存過程名字     (      引數1 IN NUMBER,

Oracle 儲存過程中傳送郵件,並支援使用者驗證 中文標題和內容

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

oracle 儲存過程 報 無效字元

lv_sql:='   insert into ETL_SUCESS_AMOUNT   select SEQ_OS_ETL_AMOUNTID.NEXTVAL AS AMOUNTID,1,AMOUNT_DATA,AMOUNT_HOUR,   serviceid,porta

Oracle儲存過程(1)

(一)儲存過程的基本語法   1  CREATE OR REPLACE PROCEDURE 儲存過程名   2  IS   3  BEGIN   4  

【學亮開講】Oracle儲存過程教學筆記(二)20181116

--帶出參的儲存過程的建立和呼叫 create or replace procedure pro_owners_add1 ( v_name varchar2,--名稱 v_addressid number,--地址編號 v_housenumber varchar2,--門牌號 v_wat

Oracle儲存過程的優化

Oracle儲存過程的優化措施 1、開發人員如果用到其他庫的Table或View,務必在當前庫中建立View來實現跨庫操作,最好不要直接使用“user_name.table_name”。 2、開發人員在提交前,必須已經分析過查詢計劃,做過自身的查詢優化檢查。 3.SQL的使用規範: 3.

Oracle儲存過程以及遊標

一.儲存過程 1、儲存過程定義 所謂儲存過程(Stored Procedure),就是一組用於完成特定資料庫功能的SQL語句集,該SQL語句集經過 編譯後儲存在資料庫系統中。在使用時候,使用者通過指定已經定義的儲存過程名字並給出相應的儲存過程引數 來呼叫並執行它,從而完成一個或一系列的資料庫

Oracle 儲存過程小結 遊標 ,隨機生成UUID(32位)

    業務需求:            今天領導要求後天批量插入修改資料,將A表中的資料一條條的插入到B表中,中間還夾雜這業務邏輯。  技術需求:      

oracle 儲存過程 傳送WebServie 請求

create or replace procedure CMS_TO_ESB_INTEGRAL is --呼叫ESB積分錯誤是重發介面 http_req utl_http.req; http_resp utl_http.resp; request_env clob; l_re

Oracle:儲存過程的使用

Oracle:儲存過程的使用 以sys身份登入,建立使用者c##zs,密碼111,分配dba角色 以c##zs身份登入,匯入資料表 編寫儲存過程,根據學生學號,查詢出學生所選課程成績等級, 列印結果示例: 1801001 張三 Oracle A 1801001 張三 Java C 參

oracle儲存過程把查詢到的值更新到別的表

create or replace procedure update_nst_t_Clime2 as cursor c_db is select * from NST_T_FRAME f