oracle 游标简单示例

  1.游标的概念以及作用

      游标(Cursor)可以使用户想操作数组一样对查询出来的结果集进行操作,可以形象的看做一个变动的光标,其实际行是一个指针,它在一段Oracle存放数据查询结果集或数据

    操作集的内存中,这个指针可以指向结果集的任何位置。

    分类: 分为静态游标和ref游标(暂不做介绍)。静态游标 又分为 显示游标和隐式游标 ,隐式游标它是被oracle自动管理的 ,不需要详细的去了解只需要 知道怎么用就可以了。

      显示游标:就是我们普遍使用的。就是在使用之前有着明确的定义,一般都会关联数据查询语句,返回一行或多行记录。

      使用步骤:1.声明游标  2.打开游标 3.提取数据 4.关闭游标  

    语法结构:简单语法结构如下代码示例    

 1 DECLARE CURSOR cursor_name
 2      --1.声明名为cursor_name 的游标
 3      IS          
 4         --与之关联的sql语句               
 5        SELECT ID ,NAME ,score FROM TABLE ;
 6          --声明了一个与数据表字段name类型一样的变量myname
 7        myname tablename.name%TYPE;   
 8         --声明了一个可以去表中一行记录的变量
 9        myrow tablename%ROWTYPE;   
10     BEGIN         
11      --2.打开游标
12         OPEN cursor_name; 
13      --3.提取数据   
14         FETCH CURSOR INTO myrow; 
15         dbms_output.put_line(myrow.name||'---'||myrow.id);
16         
17       --4.关闭游标
18         CLOSE cursor_name;
19     END;   

       通常显示游标提取的数据不会只有一条,所有想遍历其结果集就需使用loop

    下边创建一张简单的数据表,使用loop游标操作数据

1 CREATE TABLE cur_test_student(
2        --创建简单的测试表 id号, 名字 ,分数 ,科目,年龄
3     sid NUMBER(8) PRIMARY KEY,   
4     sname VARCHAR2(10) NOT null,   
5     score NUMBER(8) NOT null,
6     subject  Varchar2(20),
7     sage NUMBER(8)
8 );

 

   loop游标示例:

  

 1 DECLARE CURSOR cur_score
 2 --声明游标查询某一科目所有学生的name和score
 3 IS
 4  SELECT sname,score FROM cur_test_student WHERE subject='语文'; 
 5     namee cur_test_student.sname%TYPE;
 6     sco cur_test_student.score%TYPE;
 7     
 8  BEGIN
 9    OPEN cur_score; 
10      LOOP    
11      --提取数据保存到两个变量中
12        FETCH cur_score INTO namee,sco; 
13        --隐式游标判断当没有数据是退出循环 
14        EXIT WHEN cur_score%NOTFOUND;
15        dbms_output.put_line(namee||'----------'||sco);
16        
17      END LOOP;
18    CLOSE cur_score;
19  END;

      

   for循环游标:

  游标for循环是在pl/sql块中使用游标最简单的方式,它简化了对游标的处理。当使用游标for循环时,oracle会隐含的打开游标,提取游标数据并关闭游标。

  

 1 DECLARE CURSOR cur_score
 2 --声明游标查询某一科目所有学生的name和score
 3 IS
 4  SELECT sname,score FROM cur_test_student WHERE subject='语文'; 
 5    BEGIN
 6  FOR student_recode IN cur_score LOOP
 7  
 8  dbms_output.put_line(student_recode.sname||'---'||student_recode.score);
 9  
10   END LOOP;
11  END;

    注意两种写发的不同之处:在for循环的游标中没有 打开游标 关闭游标等四部操作,很多工作oracle隐式的帮我们执行了 也不需要判断合适退出等工作。

  这种写法比简单明了。

带参数的游标

  使用游标是可以指定参数,可以传入多个参数 方便多条件查询,在存储过程中也可以方便的使用

  

 1 DECLARE CURSOR cur_score(sub VARCHAR2) IS
 2 
 3     SELECT sname ,score FROM cur_test_student WHERE subject=sub;
 4     
 5     BEGIN
 6        FOR score_recode IN cur_score('语文')LOOP
 7           
 8         dbms_output.put_line(score_recode.sname||'---'||score_recode.score);
 9     
10      END LOOP;
11     END;

 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  

    

    

猜你喜欢

转载自www.cnblogs.com/gubai/p/9018755.html