zoukankan      html  css  js  c++  java
  • Oracle的循环和Corsor

       这两天啊有一个心的业务,是须要假设我批量改动数据的话,那么还有一张表的数据也须要改动。也是多条的改动,发现这个问题的时候。自然而然的想到了触发器,可是曾经都是简单的单条语句的跟新,没有过整个表的去做一个触发器。今天学习了一下数据库中的循环,这里写一下。
        在写触发器的时候用到了一个循环和一个Cursor,触发器例如以下:
    
    CREATE OR REPLACE TRIGGER trg_test
      before update
      ON cm_bogie_inandoutreport 
      DECLARE
        //定义游标,查找表里边的每一列的值
             cursor c_bogie is select s_bureaunumno c_b_bureaunumno,
             s_serialnum  c_b_serialnum,
                 s_trainsetid c_b_trainsetid 
                 from cm_bogie_inandoutreport;
    
      BEGIN
                 //循环赋值
                 for v_record in c_bogie loop
                     update test_mhb t
                     set t.s_id=v_record.c_b_bureaunumno
                     where t.s_sex = v_record.c_b_bureaunumno;
                     dbms_output.put_line(c_b_bureaunumno);
                 end loop;
      END trg_test;
    

    循环
    一般循环大概分为三种:基本循环(loop)。WHILE循环, FOR循环

    1.基本循环

    LOOP 
    
             statement1; 
    
             ...... 
    
              EXIT [WHEN condition]; 
    
    END LOOP; 

    当使用基本循环时。不管是否满足条件,语句至少会被运行一次。当condition为TRUE时,会退出循环。并运行END LOOP后的对应操作。当编写基本循环时一定要包含EXIT语句,否则会陷入死循环。另外还应该定义循环控制变量。而且在循环体内改动循环控制变量的值。演示样例:

    SQL> declare
        i int:=1;
        begin
        loop
        insert into testloop values(i);
        exit when i=10;
        i:=i+1;
        end loop;
        end;

    2.WHILE循环

    基本循环至少要运行一次循环体内的语句。而对于WHILE循环来说,仅仅有条件为TRUE时,才会运行循环体内的语句。

    WHILE循环以WHILE …LOOP開始。以END LOOP结束。

    WHILE condition LOOP 
    
               statement1; 
    
               statement2; 
    
               ..... 
    
    END LOOP; 
    

    当condition为TRUE时。运行循环体内的语句。而当condition为FALSE或NULL时。会退出循环,并运行END LOOP后的语句。当使用WHILE循环时。应该定义循环控制变量。并在循环体内改变循环控制变量的值。

    演示样例:

    SQL> declare
        i int:=1;
        begin
        while i<=10 loop
        insert into testloop values(i);
        i:=i+1;
        end loop;
        end; 

    3.FOR循环

    当使用基本循环或WHILE循环时,须要定义循环控制变量。而且循环控制变量不仅能够使用NUMBER类型。也能够使用其它数据类型。当使用FOR循环时,ORACLE会隐含定义循环控制变量。

    FOR counter in [REVERSE] lower_bound. .upper_bound LOOP 
    
             statement1; 
    
             statement2; 
    
             ....... 
    
    END LOOP; 
    
    

    在我们查询的时候是用select和into一起使用,把select的内容放到into里边。而cursor给我们提供了一个便利。那么问题来了
    什么是游标?
    ①从表中检索出结果集,从中每次指向一条记录进行交互的机制。

    ②关系数据库中的操作是在完整的行集合上运行的。


    由 SELECT 语句返回的行集合包含满足该语句的 WHERE 子句所列条件的全部行。

    由该语句返回完整的行集合叫做结果集。
    应用程序,尤其是互动和在线应用程序,把完整的结果集作为一个单元处理并不总是有效的。
    这些应用程序须要一种机制来一次处理一行或连续的几行。

    而游标是对提供这一机制的结果集的扩展。

     游标是通过游标库来实现的。

    游标库是经常作为数据库系统或数据訪问 API 的一部分而得以实现的软件, 用来管理从数据源返回的数据的属性(结果集)。这些属性包含并发管理、在结果集中的位置、返回的行数。 以及能否够在结果集中向前和/或向后移动(可滚动性)。

    游标跟踪结果集中的位置。并同意对结果集逐行运行多个操作,在这个过程中可能返回至原始表,也可能不返回至原始表。 换句话说,游标从概念上讲基于数据库的表返回结果集。

    因为它指示结果集中的当前位置 。就像计算机屏幕上的光标指示当前位置一样,“游标”由此得名。

    2,游标有什么作用?
    ①指定结果集中特定行的位置。
    ②基于当前的结果集位置检索一行或连续的几行。
    ③在结果集的当前位置改动行中的数据。
    ④对其它用户所做的数据更改定义不同的敏感性级别。
    ⑤能够以编程的方式訪问数据库。
    3、游标怎么用

    样例1:
      /* conn scott/tiger */
       Declare
         Cursor myCur is select empno,ename,sal from emp;
         vna varchar2(10);
         vno number(4);
         vsal number(7,2);
      Begin
         open myCur;
         fetch myCur into vno,vna,vsal;
         dbms_output.put_line(vno||'    '||vna||'    '||vsal);
         close myCur;
      End;
      /
    
     样例2:使用loop遍历游标。
     /* conn scott/tiger */
      Declare
         Cursor myCur is select ename,job,sal,empno from emp;
         varE myCur%rowType;
      Begin
         if myCur%isopen = false then
            open myCur;
           dbms_output.put_line('Opening...');
         end if;
         loop
            fetch myCur into varE;
            exit when myCur%notfound; 
            dbms_output.put_line(myCur%rowCount||'    '||vare.empno||'    '||vare.ename||'    '||vare.sal);
         end loop;
         if myCur%isopen then
            Close myCur;
            dbms_output.put_line('Closing...');
         end if;
      End;
    
       事实上游标还是挺好用的,就和Select 。。

    。into...一样,游标大家把他当作是一个表就能够。仅仅只是这个游标还是指向咱们查询出来表的第一行。

  • 相关阅读:
    安卓手机无法使用adb导出文件
    dex2jar 报错 com.googlecode.d2j.DexException: not support version
    夜神模拟器adb连接
    无法安装 /lib/x86_64-linux-gnu/libpng12.so.0 的新版本: 没有那个文件或目录
    mysql基础 -创建
    VScode
    阿强的TypeScript基础
    Vue由浅入深之Array变化侦测
    深入浅出Vue.js一之Object的变化侦测
    阿强工作中常用的js的数组方法汇总
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7171059.html
Copyright © 2011-2022 走看看