文章出處

 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:該數字屬性返回了到目前為止,游標所檢索數據庫行的個數。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()