游標的常用屬性


游標的常用屬性

1、SQL%ROWCOUNT
   
   受最近的SQL語句影響的行數——數值型
   (1)、如果聲明了游標,但不打開,則返回INVALID_CURSOR,或者光標已關閉。
   (2)、返回獲取的行數。
   (3)、除非遍歷整個游標,否則ROWCOUNT屬性不會給出真正的行數。
      換句話說,不應該依賴這個屬性來告訴游標在打開后有多少行。

2、SQL%FOUND
   最近的SQL語句是否影響了一行以上的數據——布爾型
   (1)、如果聲明了游標,但不打開,則返回INVALID_CURSOR,或者游標已關閉。
   (2)、如果游標處於打開狀態,則返回NULL,但未執行提取。
   (3)、如果執行成功,則返回TRUE。如果沒有行被返回,則返回FALSE。

3、SQL%NOTFOUND
   最近的SQL語句是否未影響任何數據——布爾型
   (1)、如果聲明了游標,但不打開,則返回INVALID_CURSOR,或者游標已關閉。
   (2)、如果游標處於打開狀態,則返回NULL,但未執行提取。
   (3)、如果執行了成功的提取,則返回FALSE。 如果沒有行被返回,則返回TRUE。

4、SQL%ISOPEN  
   
   如果光標處於打開狀態,則返回TRUE;如果光標處於關閉狀態,則返回FALSE。
   對於隱式游標而言永遠為FALSE——布爾型

例、當一條DML語句被執行后,DML的結果會保存在四個游標屬性中。隱式游標的SQL%ISOPEN的值永遠為FALSE。

   1、當SELECT INTO,INSERT,UPDATE或DELETE成功時,
 
     SQL%FOUND為True,

     SQL%NOTFOUND為False,
 
     SQL%ROWCOUNT等於影響的行數(SELECT INTO的ROWCOUNT一定為1;INSERT...VALUES...的ROW_COUNT一定為1)。

  2、當SELECT INTO或INSERT不成功時,拋出異常;

     當UPDATE或DELETE不成功時,

    SQL%FOUND為False,

    SQL%NOTFOUND為True,

    SQL%ROWCOUNT等於0。

5、SELECT測試
   -- SQL%FOUND, SQL%NOTFOUND, SQL%ROWCOUNT 對 SELECT 的測試  
   DECLARE
     v_temp employees%ROWTYPE;
   BEGIN
     SELECT *
     INTO v_temp
     FROM employees e
     WHERE employee_id = 10;
 
     IF SQL%FOUND THEN
        DBMS_OUTPUT.put_line('SQL%FOUND');
     END IF;
     -- 這里取不到的,因為有INTO的賦值
     IF SQL%NOTFOUND THEN
        DBMS_OUTPUT.put_line('SQL%NOTFOUND');
     END IF;
     DBMS_OUTPUT.put_line('SQL%ROWCOUNT : ' || SQL%ROWCOUNT);
 
     EXCEPTION
       WHEN no_data_found THEN
         DBMS_OUTPUT.put_line('Exception: no_data_found');
         DBMS_OUTPUT.put_line('SQL%ROWCOUNT : ' || SQL%ROWCOUNT);
   END;
   /*
   測試結果:如果查到結果,SQL%FOUND = True,SQL%NOTFOUND = False,SQL%ROWCOUNT = 1;
             如果沒有查到結果,SQL%ROWCOUNT = 0,拋出異常
   */
6、INSERT測試
   -- SQL%FOUND, SQL%NOTFOUND, SQL%ROWCOUNT 對 INSERT 的測試  
   -- 插入n條
   BEGIN
     INSERT INTO departments(department_id, department_name)
     VALUES(270, 'Tang');
 
     IF SQL%FOUND THEN
        DBMS_OUTPUT.put_line('SQL%FOUND');
     END IF;
     IF SQL%NOTFOUND THEN
        DBMS_OUTPUT.put_line('SQL%NOTFOUND');
     END IF;
     DBMS_OUTPUT.put_line('SQL%ROWCOUNT : ' || SQL%ROWCOUNT);
 
     EXCEPTION
       WHEN OTHERS THEN
         DBMS_OUTPUT.put_line('Something Error!');
         DBMS_OUTPUT.put_line('SQL%ROWCOUNT : ' || SQL%ROWCOUNT);
   END;
   /*
   測試結果:如果發生了插入,SQL%FOUND = True,SQL%NOTFOUND = False,SQL%ROWCOUNT為插入的行數,通常為1;
          如果插入不成功,SQL%ROWCOUNT = 0,拋出異常
   */
7、UPDATE測試
   -- SQL%FOUND, SQL%NOTFOUND, SQL%ROWCOUNT 對 UPDATE 的測試  
   BEGIN
     UPDATE employees e
     SET salary = 10000
     -- WHERE employee_id < 103;
     WHERE employee_id < 10;
 
     IF SQL%FOUND THEN
        DBMS_OUTPUT.put_line('SQL%FOUND');
     END IF;
     IF SQL%NOTFOUND THEN
        DBMS_OUTPUT.put_line('SQL%NOTFOUND');
     END IF;
     DBMS_OUTPUT.put_line('SQL%ROWCOUNT : ' || SQL%ROWCOUNT);
   END;
   /*
   測試結果:如果發生了更改,SQL%FOUND = True,SQL%NOTFOUND = False,SQL%ROWCOUNT為對應修改的行數;
             如果沒有發生過更改,SQL%FOUND = False,SQL%NOTFOUND = True,SQL%ROWCOUNT = 0
   */
8、DELETE測試
   -- SQL%FOUND, SQL%NOTFOUND, SQL%ROWCOUNT 對 DELETE 的測試  
   BEGIN
     DELETE FROM departments
     WHERE department_id IN (250, 260);
 
     IF SQL%FOUND THEN
        DBMS_OUTPUT.put_line('SQL%FOUND');
     END IF;
     IF SQL%NOTFOUND THEN
        DBMS_OUTPUT.put_line('SQL%NOTFOUND');
     END IF;
     DBMS_OUTPUT.put_line('SQL%ROWCOUNT : ' || SQL%ROWCOUNT);
   END;
   /*
   測試結果:如果成功刪除,SQL%FOUND = True,SQL%NOTFOUND = False,SQL%ROWCOUNT為插入的行數,通常為1;
             如果刪除不成功,SQL%FOUND = False,SQL%NOTFOUND = True,SQL%ROWCOUNT = 0
   */


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM