1.什么是游标
在oracle中执行select、update、insert、delete等操作时,oracle会在内存中为其分配上下文,即开辟一小块数据缓冲区,用于将查询到的结果集缓存起来。游标就是指向这个缓冲区的指针,便于进行逐行定位处理。游标使用完成后要及时关闭。
2.游标的分类
显式游标:显示游标指定游标的名字,调用方式:游标名+属性
隐式游标:没有名字,执行select、update、delete、insert操作时,会自动触发隐士游标,调用方式:sql+属性
3.游标的属性
游标名%found 判断游标中是否读到数据
游标名%notfound 判断游标中是否没有读到数据
游标名%isopen 判断游标是否打开
游标名%rowcount 获取游标中实际读取的行的数量
游标处理数据的效率较低,非必要情况,不建议使用
显示游标:
1.创建游标
declare --1. 定义游标 -- cursor 游标名 is 查询命令 cursor cur_emp is select empno,ename,job from emp where empno=7369; row1 emp.empno%type; row2 emp.ename%type; row3 emp.job%type; begin --2. 打开游标 open 游标名 open cur_emp; --3. 提取数据 fetch 游标名 into 变量1,变量2,... fetch cur_emp into row1,row2,row3; dbms_output.put_line(row1); dbms_output.put_line(row2); dbms_output.put_line(row3); --4. 关闭游标 close 游标名 close cur_emp; end;
declare cursor emp_cur is select * from emp; row1 emp%rowtype; begin -- 当游标中有多个数据时,使用循环来提取数据 open emp_cur; loop fetch emp_cur into row1; exit when emp_cur%notfound; dbms_output.put_line(emp_cur%rowcount||'--'||row1.empno||':'||row1.ename); end loop; close emp_cur; end;
2.带参数的游标
-- 带参数的游标 declare -- 定义带参数的游标,在命令中使用参数 cursor cur_emp(no emp.empno%type) is select * from emp where empno=no; row1 emp%rowtype; begin -- 打开游标传参 open cur_emp(7369); -- 提取数据 fetch cur_emp into row1; dbms_output.put_line(row1.ename||row1.job); -- 关闭游标 close cur_emp; end;
3.读取数据到表格中
-- 将数据读到表格中 declare -- 定义表格类型 type emp_table is table of emp%rowtype index by binary_integer ; -- 声明表格变量 v_emp emp_table; -- 声明游标 cursor cur_emp is select * from emp; begin -- 打开游标 open cur_emp; -- 提取游标内数据到表格,使用bulk collect into 关键字,批量插入到表格中 fetch cur_emp bulk collect into v_emp; -- 使用循环来读取表中数据 for i in v_emp.first..v_emp.LAST loop dbms_output.put_line(v_emp(i).ename||':'||v_emp(i).job); end loop; end;
4.游标类型的变量
-- 游标类型的变量,存储过程中当作参数使用 create or replace procedure pro4( cur sys_refcursor )as row1 emp%rowtype; begin loop fetch cur into row1; exit when cur%notfound; dbms_output.put_line(row1.ename); end loop; end; declare type cur_type is ref cursor ; emp_cur cur_type; begin open emp_cur for select * from emp; pro4(emp_cur); close emp_cur; end;
5.使用for简化游标的操作
declare cursor emp_cur is select * from emp; begin for i in emp_cur loop dbms_output.put_line(i.ename); end loop; end;
隐式游标(sql+属性名):
declare begin update emp set ename = 'lisi' where empno=7369; if sql%found then dbms_output.put_line('更新了数据'); end if; end;
系统游标类型
-- sys refcursor 系统游标变量 create or replace procedure pro5(cur out sys_refcursor) as begin open cur for select * from emp; end; declare cur sys_refcursor; row1 emp%rowtype; begin pro5(cur); loop -- 在存储过程中,给系统游标赋值,在这里直接就可以调用不用再次赋值 fetch cur into row1; exit when cur%notfound; dbms_output.put_line(row1.ename); end loop; close cur; end;
来源:https://www.cnblogs.com/Zs-book1/p/11234204.html