问答详情
源自:3-2 PL/SQL光标之光标的语法和第一个实例

游标的问题

1.写一个存储过程
  输入:员工编号
  输出: 如果这个存在,则输出部门编号,如果部门不存在,则输出0
  部门存在,则显示这个部门的所有的员工的信息

提问者:qq__5778 2017-03-28 20:03

个回答

  • 慕斯8690777
    2017-03-29 11:58:03

    /*
    1.写一个存储过程
      输入:员工编号
      输出: 如果这个存在,则输出部门编号,如果部门不存在,则输出0
      部门存在,则显示这个部门的所有的员工的信息
    SQL语句:
    select depno from emp where empno = ??;
    判断存在一条记录,或者不存在记录,有两种方式实现
    1. 通过系统例外NO_DATA_FOUND实现
    2. 通过游标属性%notfound实现
    --这里选择通过游标实现
    select * from emp;
    --集合-->游标-->循环-->退出条件:%notfound

    变量:初始值  如何得到
    v_depno number :=0;
    v_empno number := &empno;

    */

    set serveroutput on
    accept empno prompt 'Please input empno:';

    declare

    --定义游标
        cursor c_emp(t_empno number) is select depno from emp where empno = t_empno;
        v_depno emp.depno%type;
    --所有员工信息的游标
        cursor c_all_emp is select * from emp;
        v_all_emp emp%rowtype;
    --定义输入接收的变量
        v_empno number := &empno;
    begin
        --打开光标
        open c_emp(v_empno);
        --得到部门号
        fetch c_emp into v_depno;
        if c_emp%notfound then
            dbms_output.put_line('0部门存在.');
            --输出所有员工信息
            --打开所有员工游标
            open c_all_emp;
            loop
                --得到一个员工的信息
                fetch c_all_emp into v_all_emp;
                exit when c_all_emp%notfound;
                --打印一个员工的信息
                dbms_output.put_line(v_all.emp.empno||' '||v_all_empno.depno||'...');
                
            end loop;
            --关闭所有员工游标
            close c_all_emp;
        else
            dbms_output.put_line('depno is '||v_depno);
        end if;

    --关闭光标
        close c_emp;

    end;
    /