• 隐式游标常用属性之 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的对比。

  • 相关阅读:
    stdin和STDIN_FILENO的区别
    运算放大器和仪表放大器有哪些区别?
    仪表放大器与运算放大器的区别是什么?
    如何将库文件移到另一个库
    altium designer 中器件原理图库中,将一个器件分成几部分是如何操作的?就是如何用part表示?
    linux串口基本编程
    WCF寄宿(Host)之自我寄宿(Self-Hosting)简单实例【Windows应用程序宿主】
    WCF寄宿(Host)之自我寄宿(Self-Hosting)简单实例【Console应用为宿主】
    GUI创建各常用控件(二)
    GUI创建各常用控件(一)
  • 原文地址:https://www.cnblogs.com/AlleyMeowy/p/11010395.html
Copyright © 2020-2023  润新知