zoukankan      html  css  js  c++  java
  • 隐式游标常用属性之 SQL%FOUND,SQL%NOTFOUND 和 SQL%ROWCOUNT

      隐式游标的几个常用属性如下:

      SQL%ROWCOUNT 受最近的SQL语句影响的行数——数值型

      SQL%FOUND 最近的SQL语句是否影响了一行以上的数据——布尔型

      SQL%NOTFOUND 最近的SQL语句是否未影响任何数据——布尔型

      SQL%ISOPEN 对于隐式游标而言永远为FALSE——布尔型

      当一条DML语句被执行后,DML的结果会保存在四个游标属性中。隐式游标的SQL%ISOPEN的值永远为FALSE。

      当SELECT INTO,INSERT,UPDATE或DELETE成功时,

        SQL%FOUND为True,

        SQL%NOTFOUND为False,

        SQL%ROWCOUNT等于影响的行数(SELECT INTO的ROWCOUNT一定为1;INSERT...VALUES...的ROW_COUNT一定为1)。

      当SELECT INTO或INSERT不成功时,抛出异常

      当UPDATE或DELETE不成功时,

        SQL%FOUND为False,

        SQL%NOTFOUND为True,

        SQL%ROWCOUNT等于0。

     

      附上测试代码,SELECT比另外三个多了Exception:

      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,抛出异常
    */

      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,抛出异常
    */

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

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

      完毕。下一篇写NO_DATA_FOUND和SQL%NOT_FOUND的对比。

  • 相关阅读:
    【转】互联网科技大佬奋斗励志故事
    Java RestTemplate 请求参数字符串中有大括号{}的请求正确方法
    【资料最全】在100以内的所有情况,可以被写作三个数的立方和
    一个例子让你懂java里面的守护线程
    java中finally里面的代码一定会执行吗?(try里面做了return呢?)
    什么是mysql索引下推(有些装B面试官会问)
    java中静态变量指向的对象是在jvm那个区域?用图解告诉你。
    偶然发现在java方法中可以定义类
    Java里面的Comparable接口
    leetcode面试题 17.14. 最小K个数(快速排序,只排序一边)
  • 原文地址:https://www.cnblogs.com/AlleyMeowy/p/11010395.html
Copyright © 2011-2022 走看看