zoukankan      html  css  js  c++  java
  • 游标的常用属性

    游标的常用属性

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

  • 相关阅读:
    day74 作业
    day73 基表 表关联
    不知道第几次分享了
    day72 序列化家族
    day72 作业
    vscode
    vuex
    linux python3.7的安装和配置
    使用多线程分批发送短信代码,分割list
    docker 容器里使用crontab不生效
  • 原文地址:https://www.cnblogs.com/lxm11/p/12054333.html
Copyright © 2011-2022 走看看