游标本质
隐式游标:查询单行记录
显式游标:查询多行记录
隐式游标
Oracle自动在后台使用的游标,用户不参与任何操作,所以对用户是“透明”(隐藏)的。
不能手动打开、提取、关闭
使用SELECT...INTO...语句时,Oracle会自动创建、打开、取值(Fetch)、Close。
通过检查隐式游标属性,可以获取最近执行的select单行语句或者其它DML语句信息。
• 案例一:%TYPE
查询scott的姓名并输出
特点:查询一个值
DECLARE
v_name emp.ename%TYPE;
BEGIN
SELECT ename INTO v_name FROM emp WHERE empno=7788;
dbms_output.put_line(v_name);
END;
• 案例二:%ROWTYPE
查询scott的所有信息并输出
特点:查询一行值
DECLARE
v_emp emp%ROWTYPE;--行类型,代表一行
BEGIN
SELECT * INTO v_emp FROM emp WHERE empno=7788;
dbms_output.put_line(v_emp.empno||'---'||v_emp.ename||'---'||v_emp.sal);
END;
• 案例三:常见异常处理
根据员工工资查询并输出姓名
特点:可能无数据(返回0行)或者数据太多(返回多行)
DECLARE
v_name emp.ename%TYPE;
BEGIN
SELECT emp.ename INTO v_name FROM emp WHERE emp.sal=1250;
dbms_output.put_line(v_name);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('没有这个数据');
WHEN too_many_rows THEN
dbms_output.put_line('不能返回多行到select into');
WHEN OTHERS THEN
dbms_output.put_line('其他错误');
END;
显式游标
在PL/SQL如何返回多行记录并逐行进行处理。
为什么不能用select?(因为select全部返回,不能逐行。)
手工定义并使用的游标叫显式游标。
语法: cursor 游标名 is
select 语句
使用步骤:
定义游标名称和SELECT语句 cursor
通过OPEN语句打开游标 open
通过FETCH语句获取游标数据(如果有多行则在循环语句中使用FETCH语句)
关闭游标 close
显式游标修改数据:
cursor 游标名 is
select 语句 for update --单个表
cursor 游标名 is
select 语句 for update of 列名 --多个表
游标FOR循环(实用)
• 案例一
打印所有员工的部门名称和员工姓名。
说明:使用两种方式。
方法一:
BEGIN
FOR x IN (SELECT d.dname,e.ename AS xm FROM emp e,dept d WHERE e.deptno=e.deptno)
LOOP
dbms_output.put_line(x.dname||'---'||x.xm);
END LOOP;
END;
方法二:
DECLARE
v_deptname dept.dname%TYPE;
BEGIN
FOR x IN(SELECT * FROM emp)
LOOP
SELECT d.dname INTO v_deptname FROM dept d WHERE d.deptno=x.deptno;
dbms_output.put_line(x.ename||'---'||v_deptname);
END LOOP;
END;
• 案例二
加工资,经理加3K,员工加1.5K。
步骤:通过FOR循环改写。
BEGIN
FOR emp_cur IN (SELECT * FROM emp where ename like '%S%' FOR UPDATE)
LOOP
IF(emp_cur.job='MANAGER')THEN
UPDATE emp e SET e.sal=e.sal+3000 WHERE e.empno = emp_cur.empno;
ELSE
UPDATE emp e SET e.sal=e.sal+1000 WHERE e.empno = emp_cur.empno;
END IF;
END LOOP;
END;
|