sql游标文章目录什么是sql游标? 光标分类1 .显式光标2 .隐式光标3 .光标参数4 .定义光标类型
一个光标是什么?
游标: oracle在执行sql语句时为每个sql语句分配缓冲区。
用于临时存储sql语句和sql语句的结果和参数。
光标是指向该缓冲区的指针(地址),
操作游标可以处理sql的执行结果
布尔型,布尔型:值只有三个。 不能直接打印true、false、null和boolean类型。 只能作为条件使用
光标分类光标分为显式光标和隐式光标。 **
光标属性:
%found :返回布尔型数据。 如果当前光标指向的数据不为空,则返回true;否则返回false
%notfound:和%found相反,如果光标指向的数据为空,则返回true;否则返回false
%isopen:返回布尔类型,如果当前光标打开,则返回true;如果未打开,则返回false
%rowcount:返回光标当前数据的数据行号,以及表示光标指向的结果集中的数据数的数字。
使用光标属性:
光标名称%属性名称
1 .显式游标自行定义要使用的游标。
光标定义:
cursor光标变量名is select语句;
使用光标:
1 .打开光标
open光标变量名称;
使用fetch into语句将光标指向以下数据,并将数据保存在变量中
fetch光标变量into变量;
3 .处理当前变量中的数据(使用循环遍历光标) ) ) ) ) ) ) ) ) )。
4 .关闭光标
close光标变量
用光标打印emp表中的所有员工信息
- -用光标打印EMP表中的所有员工信息declare-- EMP表中的所有信息cursor c_emp is select * from emp; -光标中的记录v_EMP%rowtype; begin --光标open c_emp; --loop循环游标结果集运行loop--fetchinto以获取下一个数据fetch c_emp into v_emp; -确定光标是否为空,如果为空,则循环exit when c_emp%notfound; -当前v_emp变量的数据DBMS _ output.put _ line (c _ EMP % rowcount||,(||v_emp.empno||,(|v_EMP.empno ) ) DBMS _ output.put _ line (c _ EMP % rowcount; -关闭光标close c_emp; 结束; while循环遍历光标
--while循环游标declare --所有员工信息cursor c_emp is select * from emp; -定义保存光标记录v_EMP%rowtype的变量; begin --光标open c_emp; -将光标移动到第一个数据fetch c_emp into v_emp; -光标while c_emp%found loop --处理当前v_emp变量的数据。 DBMS _ output.put _ line (c _ EMP % rowcount|||v _ e mount -将光标移动到以下数据fetch c_emp into v_emp; 结尾环路; -关闭光标close c_emp; 结束; 遍历光标的最简单方法for循环遍历
--遍历游标的最简单方法for环路遍历declare --所有emp表中的数据cursor c_emp is select * from emp; begin for v_emp in c_emp loop --处理当前v_emp变量的数据。 DBMS _ output.put _ line (c _ EMP % rowcount||,v_emp end loop; 结束; 2 .隐式游标隐式游标:系统在执行delete、update和insert语句时自动分配游标。
游标名称为sql,SQL % foundsql % not found SQL % rowcount SQL % is open;
比根
更新EMP set sal=sal 1
00;dbms_output.put_line(sql%rowcount);
end; 3.游标参数
语法:
cursor 游标名(形参名 参数类型[:=默认值],…) is select语句
select语句中可以使用形参名作为查询条件
使用
打开游标
open 游标名(实参);
传参方式3种
1.传值
2.传变量,将变量的值传给游标
3.按位传值 ,形参名=>值
遍历游标和之间一样
关闭游标
close 游标名;
输入一个部门编号,查询出部门下的所有员工信息
--输入一个部门编号,查询出部门下的所有员工信息declare --声名一个游标变量 cursor cur is select * from emp where deptno=&deptno; --声名一个变量用来保存游标中的一条记录 v_emp emp%rowtype; begin --打开游标 open cur; --遍历游标 loop --将游标指向下一条数据 fetch cur into v_emp; --判断游标是否为空 exit when cur%notfound; --打印员工信息 dbms_output.put_line(v_emp.ename||','||v_emp.job||','||v_emp.sal||','||v_emp.deptno); end loop; --关闭游标 close cur;end; declare --声名一个游标变量 cursor cur(v_dno number:=10) is select * from emp where deptno=v_dno; --声名一个变量用来保存游标中的一条记录 v_emp emp%rowtype; --声名一个变量 v_deptno emp.deptno%type;begin --从键盘输入一个部门编号,存入v_deptno中 v_deptno:=&deptno; --打开游标 open cur(v_deptno); --open cur(10); --遍历游标 loop --将游标指向下一条数据 fetch cur into v_emp; --判断游标是否为空 exit when cur%notfound; --打印员工信息 dbms_output.put_line(v_emp.ename||','||v_emp.job||','||v_emp.sal||','||v_emp.deptno); end loop; --关闭游标 close cur;end; declare --声名一个游标变量 cursor cur(v_dno number:=10) is select * from emp where deptno=v_dno; --声名一个变量用来保存游标中的一条记录 v_emp emp%rowtype; --声名一个变量 -- v_deptno emp.deptno%type;begin --从键盘输入一个部门编号,存入v_deptno中 --v_deptno:=&deptno; --打开游标 open cur; --open cur(10); --遍历游标 loop --将游标指向下一条数据 fetch cur into v_emp; --判断游标是否为空 exit when cur%notfound; --打印员工信息 dbms_output.put_line(v_emp.ename||','||v_emp.job||','||v_emp.sal||','||v_emp.deptno); end loop; --关闭游标 close cur;end; declare --声名一个游标变量 cursor cur(v_dno number:=10) is select * from emp where deptno=v_dno; --声名一个变量用来保存游标中的一条记录 v_emp emp%rowtype; --声名一个变量 -- v_deptno emp.deptno%type;begin --从键盘输入一个部门编号,存入v_deptno中 --v_deptno:=&deptno; --打开游标 open cur(10); --open cur(10); --遍历游标 loop --将游标指向下一条数据 fetch cur into v_emp; --判断游标是否为空 exit when cur%notfound; --打印员工信息 dbms_output.put_line(v_emp.ename||','||v_emp.job||','||v_emp.sal||','||v_emp.deptno); end loop; --关闭游标 close cur; --打开游标 open cur(20); --open cur(10); --遍历游标 loop --将游标指向下一条数据 fetch cur into v_emp; --判断游标是否为空 exit when cur%notfound; --打印员工信息 dbms_output.put_line(v_emp.ename||','||v_emp.job||','||v_emp.sal||','||v_emp.deptno); end loop; --关闭游标 close cur;end; 4.游标类型的定义定义游标类型语法:
type 类型名 is ref cursor; --声名一个游标类型
声名游标变量
游标变量名 游标类型名;
–游标变量的使用,只能用loop循环或while循环去变量
打开游标变量:
open 游标变量名 for select语句;
遍历和之间一样
关闭游标变量
close 游标变量
游标类型和游标变量,可以动态地指定游标所指向的结果集合
declare --声名一个游标类型 type cur_type is ref cursor; --声名一个游标变量 cur cur_type; --声名一个变量用来保存dept表中的一条记录 v_dept dept%rowtype; --声名一个变量用来保存emp表中的一条记录 v_emp emp%rowtype;begin --查询所有的部门信息 open cur for select * from dept; --遍历游标 loop --将游标指向下一条数据 fetch cur into v_dept; --判断退出条件 exit when cur%notfound; --打印部门信息 dbms_output.put_line(v_dept.deptno||','||v_dept.dname); end loop; --关闭游标 close cur; if cur%isopen then dbms_output.put_line('游标已打开'); end if; --查询所有的员工信息 --打开游标 open cur for select * from emp; --遍历游标 loop --游标指向下一条记录 fetch cur into v_emp; --判断退出条件 exit when cur%notfound; --打印员工信息 dbms_output.put_line(v_emp.ename||','||v_emp.job||','||v_emp.sal||','||v_emp.deptno); end loop; --关闭游标 close cur;end;