隐式游标通常使用于判断更新数据行或删除数据行的情况,例如:
set serverouput on
BEGIN
UPDATE emp SET sal=sal*1.2
WHERE job='SALEMAN';
IF sql%notfound THEN
DBMS_OUTPUT.PUT_LINE('没有员工工资上调');
ELSE
DBMS_OUTPUT.PUT_LINE('有'||sql%rowcount||'个员工工资上调');
END IF;
END;
显示游标通常用于查询结果集(即由SELECT语句返回的查询结果)
DECLARE
/*声明游标,查询员工信息*/
CURSOR cur_emp (var_job in varchar2:='SALESMAN')
IS SELECT empno,ename,sal
FROM emp
WHERE job=var_job;
TYPE record_emp IS RECORD --声明一个记录类型(RECORD类型)
(
/*定义当前记录的成员变量*/
var_empno emp.empno%TYPE,
var_ename emp.ename%TYPE,
var_sal emp.sal%TYPE
);
emp_row record_emp; --声明一个record_emp类型的变量
BEGIN
OPEN cur_emp('MANAGER'); --打开游标
FETCH cur_emp INTO emp_row; --先让指针指向结果集中的第一行,并将值保存到emp_row中
WHILE cur_emp%found LOOP
dbms_output.put_line(emp_row.var_ename||'的编号是'||emp_row.var_empno||',工资是'||emp_row.var_sal);
FETCH cur_emp INTO emp_row; --让指针指向结果集中的下一行,并将值保存到emp_row中
END LOOP;
CLOSE cur_emp; --关闭游标
END;
/
游标变量是动态的,可以与不同的select语句关联,而显示游标只能是静态的,是可知的。
set serveroutput on
DECLARE
TYPE ref_dept IS REF CURSOR --定义游标类型ref_dept
RETURN dept%ROWTYPE;
cur_dept ref_dept; --定义游标变量cur_dept
deptRow dept%ROWTYPE; --定义行类型
BEGIN
OPEN cur_dept FOR SELECT * FROM dept; --打开游标
LOOP
FETCH cur_dept INTO deptRow; --取得游标数据
EXIT WHEN cur_dept%notfound; --当没有数据时退出循环,则不再读取数据
dbms_output.put_line('部门编号为:'||deptRow.deptno||',部门名称为:'||deptRow.dname||',位于'||deptRow.loc);
END LOOP;
CLOSE cur_dept; --关闭游标
END;
/