A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dfasgfe 中级黑马   /  2014-3-10 16:01  /  1105 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

游标本质
隐式游标:查询单行记录

显式游标:查询多行记录

隐式游标
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;

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

1 个回复

倒序浏览
虽然我还没有学到这但是看着应该不错   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马