SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT

taogchan發表於2011-09-15

PL/SQL 會為程式中執行的每一條UPDATE,DELETE,INSERT 語句使用一個隱式遊標。隱式遊標有SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT三個屬性,這些屬性用於控制程式流程或者瞭解程式的狀態。

當執行DML語句時,PL/SQL開啟一個內建遊標並處理結果,遊標是維護查詢結果的記憶體中的一個區域,遊標在執行DML語句時開啟,完成後關閉。隱式遊標只使用SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT三個屬性。SQL%FOUND,SQL%NOTFOUND是布林值,SQL%ROWCOUNT是整數值。

1. SQL%FOUND和SQL%NOTFOUND
  在執行任何DML語句前SQL%FOUND和SQL%NOTFOUND的值都是NULL,在執行DML語句後,SQL%FOUND的屬性值將是:
        a. TRUE :INSERT
        b. TRUE :DELETE和UPDATE,至少有一行被DELETE或UPDATE.
        c. TRUE :SELECT INTO至少返回一行

      當SQL%FOUND為TRUE時,SQL%NOTFOUND為FALSE。

2. SQL%ROWCOUNT
    在執行任何DML語句之前,SQL%ROWCOUNT的值都是NULL,對於SELECT INTO語句,如果執行成功,SQL%ROWCOUNT的值為1,如果沒有成功,SQL%ROWCOUNT的值為0,同時產生一個異常NO_DATA_FOUND.

3. SQL%ISOPEN
     SQL%ISOPEN是一個布林值,如果遊標開啟,則為TRUE, 如果遊標關閉,則為FALSE.對於隱式遊標而言SQL%ISOPEN總是FALSE,這是因為隱式遊標在DML語句執行時開啟,結束時就立即關閉。

例子:
Name                                  Null?                          Type
----------------------------------------------------------------
ID                                       NOT NULL                NUMBER(9)
SALARY                                                               NUMBER(7,2)
SUBJECT_ID                       NOT NULL                NUMBER(3)
SUBJECT_DESCRIPTION                                    VARCHAR2(2)

BEGIN
   UPDATE   teacher
       SET salary = salary * 1.05
       WHERE        subject_id IN (101, 102, 103);
   IF SQL%NOTFOUND = TRUE THEN
       dbms_output.put_line(TO_CHAR(SQL%ROWCOUNT));
    END IF;
END;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22392018/viewspace-707597/,如需轉載,請註明出處,否則將追究法律責任。

相關文章