游标
游标
游标属性:
%ISOPEN:用于确定游标是否已经打开,如果游标已经打开,则返回值为true,如果游标没有打开,则返回值为false。
%FOUND:用于检查是否从结果集中提取到了数据。如果提取到数据,则返回值为true,如果未提取到数据,则返回值为false。
%NOTFOUND:与% FOUND刚好相反
%ROWCOUNT:用于返回到当前行为止已经提取到实际行数。
使用fetch....into语句提取单条记录
-- Created on 2012/4/28 by CHOWMIN declare -- 定义本地变量 v_empno emp.empno%type; v_ename emp.ename%type; v_sal emp.sal%type;
--定义游标 cursor v_emp_cursor is select empno,ename,sal from emp;
begin -- Test statements here open v_emp_cursor; loop fetch v_emp_cursor into v_empno,v_ename,v_sal; exit when v_emp_cursor%NOTFOUND; DBMS_OUTPUT.put_line('v_empno='||v_empno||' v_ename='||v_ename||' v_sal='||v_sal); end loop; close v_emp_cursor; end; |
使用fetch....bulk collect into语句提取所有记录
declare --自定义类型 cursor emp_cursor is select ename from emp where deptno =10; type ename_table_type is table of varchar2(10);
--声明一个自定义类型的变量 ename_table ename_table_type; begin open emp_cursor; fetch emp_cursor bulk collect into ename_table; for i in 1 .. (ename_table.count) loop dbms_output.put_line( ' 雇员名称:' ||ename_table(i)); end loop; close emp_cursor; end; |
使用fetch....bulk collect into….limit语句提取部分记录
declare type name_array_type is varray(5) of varchar2(10); name_array name_array_type;
cursor emp_cursor is select ename from emp; rows int := 5; v_count int := 0;
begin open emp_cursor; Loop fetch emp_cursor bulk collect into name_array limit rows; dbms_output.put_line( '雇员名称:'); for i in 1 .. (emp_cursor%rowcount-v_count) loop dbms_output.put(name_array(i)||' '); end loop; dbms_output.new_line; v_count := emp_cursor%rowcount; exit when emp_cursor%notfound; end loop; close emp_cursor; end; |
使用游标属性
declare type ename_table_type is table of varchar2(10); ename_table ename_table_type;
cursor emp_cursor is select ename from emp;
begin if not emp_cursor%isopen then open emp_cursor; end if;
fetch emp_cursor bulk collect into ename_table; dbms_output.put_line( '提取的总计行数:'|| emp_cursor%rowcount); close emp_cursor; end; |
基于游标定义记录变量
declare cursor emp_cursor is select ename,sal from emp; emp_record emp_cursor%rowtype;
begin if not emp_cursor%isopen then open emp_cursor; end if; loop fetch emp_cursor into emp_record; exit when emp_cursor%notfound; dbms_output.put_line('雇员名称:' || emp_record.ename || ' 雇员工资:' ||emp_record.sal); end loop; close emp_cursor; end; |
游标与For循环
-- Created on 2012/4/28 by CHOWMIN declare --定义游标 cursor v_emp_cursor is select empno,ename,sal from emp;
begin -- Test statements here for temp in v_emp_cursor loop DBMS_OUTPUT.put_line('empno='||temp.empno||' ename='||temp.ename||' sal='||temp.sal); end loop; end; |
Open-for语句
-- Created on 2012/4/28 by CHOWMIN declare --定义游标 type t_emp_cursor is ref cursor return emp%rowtype; v_emp_cursor t_emp_cursor; v_emp emp%rowtype;
begin -- Test statements here open v_emp_cursor for select * from emp; loop fetch v_emp_cursor into v_emp; exit when v_emp_cursor%NOTFOUND; DBMS_OUTPUT.put_line('empno='||v_emp.empno||' ename='||v_emp.ename||' sal='||v_emp.sal); end loop; close v_emp_cursor; end; |
无约束游标
-- Created on 2012/4/28 by CHOWMIN declare --定义游标 type t_cursor is ref cursor; v_cursor t_cursor;
v_emp emp%rowtype; v_dept dept%rowtype;
begin -- 查询emp表 DBMS_OUTPUT.put_line('--------------------------查询emp表-------------------------------------'); open v_cursor for select * from emp; loop fetch v_cursor into v_emp; exit when v_cursor%NOTFOUND; DBMS_OUTPUT.put_line('empno='||v_emp.empno||' ename='||v_emp.ename||' sal='||v_emp.sal); end loop; -- 查询dept表 DBMS_OUTPUT.put_line('--------------------------查询dept表-------------------------------------'); open v_cursor for select * from dept; loop fetch v_cursor into v_dept; exit when v_cursor%NOTFOUND; DBMS_OUTPUT.put_line('deptno='||v_dept.deptno||' ename='||v_dept.dname||' sal='||v_dept.loc); end loop; -- 关闭游标 close v_cursor; end; |