游标的常用属性

游标的常用属性

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
   */

相关推荐