1.游标的概念以及作用
游标(Cursor)可以使用户想操作数组一样对查询出来的结果集进行操作,可以形象的看做一个变动的光标,其实际行是一个指针,它在一段Oracle存放数据查询结果集或数据
操作集的内存中,这个指针可以指向结果集的任何位置。
分类: 分为静态游标和ref游标(暂不做介绍)。静态游标 又分为 显示游标和隐式游标 ,隐式游标它是被oracle自动管理的 ,不需要详细的去了解只需要 知道怎么用就可以了。
显示游标:就是我们普遍使用的。就是在使用之前有着明确的定义,一般都会关联数据查询语句,返回一行或多行记录。
使用步骤:1.声明游标 2.打开游标 3.提取数据 4.关闭游标
语法结构:简单语法结构如下代码示例
DECLARE CURSOR cursor_name
--1.声明名为cursor_name 的游标
IS
--与之关联的sql语句
SELECT ID ,NAME ,score FROM TABLE ;
--声明了一个与数据表字段name类型一样的变量myname
myname tablename.name%TYPE;
--声明了一个可以去表中一行记录的变量
myrow tablename%ROWTYPE;
BEGIN
--2.打开游标
OPEN cursor_name;
--3.提取数据
FETCH CURSOR INTO myrow;
dbms_output.put_line(myrow.name||'---'||myrow.id); --4.关闭游标
CLOSE cursor_name;
END;
通常显示游标提取的数据不会只有一条,所有想遍历其结果集就需使用loop
下边创建一张简单的数据表,使用loop游标操作数据
CREATE TABLE cur_test_student(
--创建简单的测试表 id号, 名字 ,分数 ,科目,年龄
sid NUMBER(8) PRIMARY KEY,
sname VARCHAR2(10) NOT null,
score NUMBER(8) NOT null,
subject Varchar2(20),
sage NUMBER(8)
);
loop游标示例:
DECLARE CURSOR cur_score
--声明游标查询某一科目所有学生的name和score
IS
SELECT sname,score FROM cur_test_student WHERE subject='语文';
namee cur_test_student.sname%TYPE;
sco cur_test_student.score%TYPE; BEGIN
OPEN cur_score;
LOOP
--提取数据保存到两个变量中
FETCH cur_score INTO namee,sco;
--隐式游标判断当没有数据是退出循环
EXIT WHEN cur_score%NOTFOUND;
dbms_output.put_line(namee||'----------'||sco); END LOOP;
CLOSE cur_score;
END;
for循环游标:
游标for循环是在pl/sql块中使用游标最简单的方式,它简化了对游标的处理。当使用游标for循环时,oracle会隐含的打开游标,提取游标数据并关闭游标。
DECLARE CURSOR cur_score
--声明游标查询某一科目所有学生的name和score
IS
SELECT sname,score FROM cur_test_student WHERE subject='语文';
BEGIN
FOR student_recode IN cur_score LOOP dbms_output.put_line(student_recode.sname||'---'||student_recode.score); END LOOP;
END;
注意两种写发的不同之处:在for循环的游标中没有 打开游标 关闭游标等四部操作,很多工作oracle隐式的帮我们执行了 也不需要判断合适退出等工作。
这种写法比简单明了。
带参数的游标
使用游标是可以指定参数,可以传入多个参数 方便多条件查询,在存储过程中也可以方便的使用
DECLARE CURSOR cur_score(sub VARCHAR2) IS SELECT sname ,score FROM cur_test_student WHERE subject=sub; BEGIN
FOR score_recode IN cur_score('语文')LOOP dbms_output.put_line(score_recode.sname||'---'||score_recode.score); END LOOP;
END;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------