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;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
原文地址:https://www.cnblogs.com/gubai/p/9018755.html