--游标
--显式游标
--显式游标的使用方式
--4个步骤
--定义游标
--语法:cursor 游标名 is 查询子句
--打开游标
--语法: open 游标名
--获取结果(遍历游标)
--语法:fetch 游标名 into 变量
--关闭游标
--语法:close 游标名
DECLARE
CURSOR cur_stu IS
SELECT * FROM student;
rec_stu student%ROWTYPE;
BEGIN
OPEN cur_stu;
FETCH cur_stu
INTO rec_stu;
CLOSE cur_stu;
dbms_output.put_line(rec_stu.s_name);
END;
DECLARE
--定义一个游标,游标指向的结果集是后面查询的结果
CURSOR cur_stu IS
SELECT * FROM student;
--定义记录类型,获取一行结果
rec_stu student%ROWTYPE;
BEGIN
--打开游标(执行查询)
OPEN cur_stu;
--通过循环,遍历结果集
LOOP
--fetch 将游标指向下一行,into将该行的值放到记录中
FETCH cur_stu
INTO rec_stu;
--获取游标的%NOTFOUND属性,如果没有取到下一行,属性值为ture;
--如果为ture,意味着没有下一行了,跳出循环
EXIT WHEN cur_stu%NOTFOUND;
--如果没有跳出循环,意味着有下一行,输出他的值
dbms_output.put_line(rec_stu.s_name);
END LOOP;
--关闭游标
CLOSE cur_stu;
END;
--练习,查询员工姓名和部门地址
DECLARE
CURSOR cur_emp IS
SELECT e.ename, d.loc FROM emp e, dept d WHERE e.deptno = d.deptno;
v_name emp.ename%TYPE;
v_loc dept.loc%TYPE;
BEGIN
OPEN cur_emp;
LOOP
FETCH cur_emp
INTO v_name, v_loc;
EXIT WHEN cur_emp%NOTFOUND;
dbms_output.put_line(v_name || '在' || v_loc || '上班');
END LOOP;
END;
--参数游标,定义游标时,可以给他加参数
DECLARE
CURSOR cur_stu(p_age student.s_age%type) IS
SELECT * FROM student WHERE s_age <= p_age;
rec_stu student%ROWTYPE;
BEGIN
OPEN cur_stu(18);
LOOP
FETCH cur_stu
INTO rec_stu;
EXIT WHEN cur_stu%NOTFOUND;
dbms_output.put_line(rec_stu.s_name);
END LOOP;
CLOSE cur_stu;
END;
--使用隐式游标,不需要定义,可以获取到最近一次操作的隐式游标
--游标名是sql
--通过4个属性知道DML操作的结果
BEGIN
UPDATE stu SET s_name = s_name || 'a' WHERE s_name LIKE '%lao%';
IF SQL%FOUND THEN
dbms_output.put_line(SQL%ROWCOUNT);
ELSE
dbms_output.put_line('没有数据被修改');
END IF;
END;
--游标for循环,遍历数据最简单的形式
--会自动打开游标
--在循环定义位置自动生成记录类型的实例
DECLARE
CURSOR cur_stu IS
SELECT * FROM student;
BEGIN
FOR stu_rec IN cur_stu LOOP
dbms_output.put_line(stu_rec.s_name || ' ' || stu_rec.s_class);
END LOOP;
END;
--游标变量
--不同之处:声明游标变量时,不与某个固定的查询挂钩
--在打开游标时,才指定查询语句
--一个游标可以执行不同的查询,多次使用
--由于open时要指定查询语句,不能用游标for循环
DECLARE
TYPE cur_type IS REF CURSOR;
cur_stu cur_type;
stu_rec student%ROWTYPE;
emp_rec emp%ROWTYPE;
BEGIN
OPEN cur_stu FOR
SELECT * FROM student;
LOOP
FETCH cur_stu
INTO stu_rec;
EXIT WHEN cur_stu%NOTFOUND;
dbms_output.put_line(stu_rec.s_name || ' ' || stu_rec.s_class);
END LOOP;
CLOSE cur_stu;
OPEN cur_stu FOR
SELECT * FROM emp;
LOOP
FETCH cur_stu
INTO emp_rec;
EXIT WHEN cur_stu%NOTFOUND;
dbms_output.put_line(emp_rec.ename || ' ' || emp_rec.sal);
END LOOP;
CLOSE cur_stu;
END;
Oracle游标举例
最新推荐文章于 2023-04-03 16:15:52 发布