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...一样,游标大家把他当作是一个表就能够。仅仅只是这个游标还是指向咱们查询出来表的第一行。

  • 相关阅读:
    Kubernetes 集成研发笔记
    Rust 1.44.0 发布
    Rust 1.43.0 发布
    PAT 甲级 1108 Finding Average (20分)
    PAT 甲级 1107 Social Clusters (30分)(并查集)
    PAT 甲级 1106 Lowest Price in Supply Chain (25分) (bfs)
    PAT 甲级 1105 Spiral Matrix (25分)(螺旋矩阵,简单模拟)
    PAT 甲级 1104 Sum of Number Segments (20分)(有坑,int *int 可能会溢出)
    java 多线程 26 : 线程池
    OpenCV_Python —— (4)形态学操作
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7171059.html
Copyright © 2011-2022 走看看