游标在目前的实际工作中接触也不多,希望以后有机会深入学习一下。
--代码15.18 在PL/SQL中使用隐式游标
BEGIN
UPDATE emp
SET comm = comm * 1.12
WHERE empno = 7369; --更新员工编号为7369的员工信息
--使用隐式游标属性判断已更新的行数
DBMS_OUTPUT.put_line (SQL%ROWCOUNT || ' 行被更新');
--如果没有任何更新
IF SQL%NOTFOUND
THEN
--显示未更新的信息
DBMS_OUTPUT.put_line ('不能更新员工号为7369的员工!');
END IF;
--向数据库提交更改
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line (SQLERRM); --如果出现异常,显示异常信息
END;
--代码15.19 定义显示游标
DECLARE
CURSOR emp_simple_cursor --简单游标定义,查询部门编号为20的数据
IS
SELECT *
FROM emp
WHERE deptno = 20;
--声明游标并指定游标返回值类型
CURSOR emp_cursor (p_deptno IN NUMBER) RETURN emp%ROWTYPE
IS
SELECT *
FROM emp
WHERE deptno = p_deptno;
BEGIN
OPEN emp_cursor (20); --打开游标
END;
--代码15.20 声明并定义游标示例
DECLARE
CURSOR c1_dept RETURN dept%ROWTYPE; --声明一个游标
CURSOR c2_emp IS --定义且声明一个游标
SELECT empno,ename,sal,comm FROM emp
WHERE deptno=20;
CURSOR c1_dept RETURN dept%ROWTYPE IS --定义游标c1_dept
SELECT * FROM dept -- 指定游标的SELECT语句和返回类型
WHERE deptno = 20;
CURSOR c3_emp RETURN emp%ROWTYPE; --声明游标c3_emp
CURSOR c3_emp IS -- 定义一个游标c3_emp
SELECT * FROM emp -- 这里可以省略掉返回类型
WHERE empno = '7369';
BEGIN
NULL;
END;
/
--代码15.21 使用Fetch语句提取游标数据
DECLARE
deptno dept.deptno%TYPE; --定义保存游标数据的变量
dname dept.dname%TYPE;
loc dept.loc%TYPE;
dept_row dept%ROWTYPE; --定义记录变量
CURSOR dept_cur IS SELECT * FROM dept; --定义游标
BEGIN
OPEN dept_cur ; --打开游标
LOOP
IF dept_cur%ROWCOUNT<=4 THEN --判断如果当前提取的游标小于等于4行
FETCH dept_cur INTO dept_row; --提取游标数据到记录类型中
IF dept_cur%FOUND THEN --如果FETCH到数据,则进行显示
DBMS_OUTPUT.PUT_LINE(dept_row.deptno||' '||dept_row.dname||' '||dept_row.loc);
END IF;
ELSE
FETCH dept_cur INTO deptno,dname,loc; --否则提取记录到变量列表中
IF dept_cur%FOUND THEN --如果提取到数据则进行显示
DBMS_OUTPUT.PUT_LINE(deptno||' '||dname||' '||loc);
END IF;
END IF;
EXIT WHEN dept_cur%NOTFOUND; --判断是否提取完成
END LOOP;
CLOSE dept_cur;
END;
--代码15.22 使用bulk collect into批量提取游标数据
DECLARE
--定义2个嵌套表类型,分别用来保存员工的编号和员工名称
TYPE IdsTab IS TABLE OF emp.empno%TYPE;
TYPE NameTab IS TABLE OF emp.ename%TYPE;
--定义2个嵌套表变量,游标数据将被提取到嵌套表变量中
ids IdsTab;
names NameTab;
--定义一个游标,用来从emp表中提取员工编号和员工姓名
CURSOR c1 IS
SELECT empno, ename
FROM emp
WHERE job = '职员';
BEGIN
--打开游标
OPEN c1;
--使用BULK COLLECT INTO子句批量提取游标数据
FETCH c1 BULK COLLECT INTO ids, names;
CLOSE c1;
--使用集合API循环提取嵌套表中的数据
FOR i IN ids.FIRST .. ids.LAST
LOOP
--输出嵌套表中的员工编号
IF ids(i) > 7900 THEN
DBMS_OUTPUT.PUT_LINE( ids(i) );
END IF;
END LOOP;
--使用集合API循环提取嵌套表中的员工姓名数据
FOR i IN names.FIRST .. names.LAST
LOOP
--输出嵌套表中姓李的员工数据
IF names(i) LIKE '李%' THEN
DBMS_OUTPUT.PUT_LINE( names(i) );
END IF;
END LOOP;
END;