• 游标的常用属性


    游标的常用属性

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

  • 相关阅读:
    反射技术的入口 获取类的Class信息
    Dom4j(Dom for Java) Day24
    通过反射 修改访问和修改属性的值 Day25
    通过反射 往泛型Integer的集合里添加String 类型的数据 Day25
    计算机网络(七),TCP与UDP的区别
    计算机网络(六),UDP报文段详解
    计算机网络(五),TCP四次挥手
    计算机网络(四),TCP三次握手
    计算机网络(三),TCP报文段详解
    计算机网络(二),TCP/IP四层模型常见协议
  • 原文地址:https://www.cnblogs.com/lxm11/p/12054333.html
Copyright © 2020-2023  润新知