• Oracle数据库—— 游标的创建和应用


    一、涉及内容

      游标的创建与应用

    二、具体操作

     (一)填空题

      1.PL/SQL 程序块主要包含3个部分:声明部分、(执行部分 )、异常处理部分。

      2.自定义异常必须使用(RAISE )语句引发。

    (二)选择题

      1.下列哪一个不是BOOLEAN变量可能的取值?(D )

        A.TRUE  B.FALSE  C.NULL D.BLANK

      2.请查看以下IF语句:

    Declare
         sal number:=500;
         comm number;
      Begin 
         If sal <100 then 
            Comm :=0;
         Elsif sal <600 then
            Comm: =sal*0.1;
         Else sal <1000 then
            Comm: =sal*0.15;
         Else 
            Comm: =sal*0.2;
         End if;
      End;

      在执行了以上语句之后,变量comm 的结果应是:(B )

      A.0  B.50  C.75 D.100

      3.在以下哪些语句中可以包含WHERE CURRENT OF 子句?(CE)

        A.OPEN   B.FETCH C.DELETE D.SELECT E.UPDATE   F.CURSOR

      4.在异常和oracle错误之间建立关联时,应该在哪个部分完成?(A)

        A.定义部分   B.执行部分  C.异常处理部分

      5.只能存在一个值的变量是哪种变量?(B )

        A.游标   B.标量变量  C.游标变量 D.记录变量

    (三)编程题

      1.编写程序计算并输出1~100的和。

      方案一:    

      语句:

    Declare 
       v_sum  integer:=0;
    begin 
       for i in 1..100 loop
          v_sum := v_sum+i;
       end loop;
       dbms_output.put_line(‘1~100的和为:’|| v_sum);
    end;
    /

      截图:

                          

      方案二:

      语句:

    Declare 
       v_sum  integer;
    begin 
        v_sum := 100*101/2;
        dbms_output.put_line(‘1~100的和为:’|| v_sum);
    end;
    /

      截图:

     

      2.分别使用显式游标和隐式游标逐行输出scott.emp表中的员工姓名和工资。

      (一)使用显式游标

       语句:

    DECLARE
       CURSOR emp_cursor01 IS SELECT ename,sal FROM scott.emp;
       emp_record emp_cursor01%ROWTYPE; 
    BEGIN
       OPEN emp_cursor01 ;
       LOOP
          FETCH emp_cursor01 INTO emp_record;
          EXIT WHEN emp_cursor01%NOTFOUND;
         dbms_output.put_line('ename:'||emp_record.ename||',sal:'||emp_record.sal);
       END LOOP;
       dbms_output.put_line('row count:'||emp_cursor01%rowcount);
        CLOSE emp_cursor01;
    END;

       截图:

     

      (二)使用隐式游标

      语句:

    BEGIN
       FOR emp_record IN (SELECT ename,sal  FROM scott.emp) 
       LOOP
         dbms_output.put_line('ename:'||emp_record.ename||',sal:'||emp_record.sal);
       END LOOP;
    END; 

      截图:

     

    (补充练习)

    1、 创建一个表top_dogs,包含两列:name varchar2(25) 和 salary NUMBER(11,2),用来存放员工姓名和工资。

    语句:

    create table top_dogs
     (name varchar2(25),
      salary NUMBER(11,2));

    截图:

     

    2、创建一个PL/SQL块,查询出工资水平前n名的员工。具体要求如下:

    (1)通过替代变量读取n的值。

    (2)通过循环从emp表中获取工资在前n名的员工的姓名和工资

    (3)将得到的员工姓名和工资写入top_dogs表。

    (4)如果有多名员工的工资相同,则每人都占n名中的一个名额。

    (5)测试特殊情况,例如n=0或者n大于员工总数。

    (6)每次向top_dogs 表中写入数据前,先清空该表中的数据。

    方案一:

    语句:

    DECLARE
       CURSOR emp_cursor(n number) IS SELECT ename,sal FROM scott.emp 
       ORDER BY sal DESC;
       v_n integer := &n;
    BEGIN
       delete from top_dogs;
       FOR rec IN emp_cursor(v_n)  LOOP
          IF emp_cursor%ROWCOUNT <=v_n THEN
             insert into top_dogs  values(rec.ename,rec.sal);      
             dbms_output.put_line('ename: '||rec.ename||'  sal:'||rec.sal);
          ELSIF v_n<=0 or v_n>emp_cursor%ROWCOUNT  then 
             dbms_output.put_line('error!');
          ELSE EXIT;    --退出循环
          END IF;
       END LOOP;
    END;
    /

    截图:

     

    n=3以及n=4:

     

    测试n=0以及n=100的情况:

            

    方案二:

    语句:

    DECLARE
       CURSOR emp_cursor IS SELECT ename,sal FROM scott.emp 
       ORDER BY sal DESC;
       v_n integer := &n;
    BEGIN
       delete from top_dogs;
       FOR rec IN emp_cursor  
    LOOP
            Exit when emp_cursor%notfound;
            Exit when emp_cursor%ROWCOUNT>v_n;
            insert into top_dogs values(rec.ename,rec.sal);      
            -- dbms_output.put_line('ename: '||rec.ename||'  sal:'||rec.sal);
          END LOOP;
    END;
    /

    截图:

     输入n:2

    输入n:3

    Select * from top_dogs

     

    输入n:0

    Select * from top_dogs

     

    输入n:100

    Select * from top_dogs

     

    3、在上题的基础上,如果员工工资相同(并列第几名),需要将前n名的员工全部输出。

    语句:

    DECLARE
       CURSOR emp_cursor IS SELECT ename,sal FROM scott.emp 
       ORDER BY sal DESC;
       v_n integer := &n;
       v_sal scott.emp.sal%type;
    BEGIN
       delete from top_dogs;
       FOR rec IN emp_cursor  
    LOOP
            Exit when emp_cursor%notfound;
            Exit when emp_cursor%ROWCOUNT>v_n and v_sal<>rec.sal;
            V_sal:= rec.sal;
            insert into top_dogs values(rec.ename,rec.sal);      
            -- dbms_output.put_line('ename: '||rec.ename||'  sal:'||rec.sal);
          END LOOP;
    END;

    输入n 的值:2

    Select * from top_dogs

    有三条记录

    截图:

     

    4、使用游标查询dept表的部门编号和名称,将其部门编号传递给另一个用于查询emp表的游标(查询emp表的员工姓名,工作,雇佣日期,工资)。

    语句:

    Declare
       Cursor dept_cur is select deptno,dname from scott.dept;
       Cursor emp_cur (c_deptno scott.emp.deptno%type) is select ename,job,hiredate,sal from scott.emp where deptno=c_deptno;
       Emp_rec emp_cur%rowtype;
    Begin
       For dept_rec in dept_cur
       Loop
         Open emp_cur(dept_rec.deptno);
         Loop
           Fetch emp_cur into Emp_rec;
           Exit when emp_cur%notfound;
           Dbms_output.put_line('ename:'|| Emp_rec.ename||' job:'|| Emp_rec.job||' hiredate:'|| Emp_rec.hiredate||' sal:'|| Emp_rec.sal);
         End loop;
         Close emp_cur;
       End loop;
    End;
    /

    截图:

     

    5、为emp表增加一个列stars,类型为VARCHAR2(100)。使用游标更新stars列:创建一个PL/SQL块,根据员工的工资计算他能获得的星号“*”数量,每100美元奖励一个星号,按四舍五入处理。并根据员工所获得的星号数量n,形成由n个星号组成的字符串,写入emp表的stars列。

    (1)为emp表增加一个列stars,类型为VARCHAR2(100)。

     

    (2)使用游标更新stars列:

    语句:

    Declare
        v_stars scott.emp.stars%type;
        v_num number:=0;
        Cursor c1 is select empno,sal,stars from scott.emp;
     Begin
        For emp_rec in c1
        Loop
          v_stars:='';
          exit when c1%notfound;
          v_num:=round(emp_rec.sal/100);
        for i in 1..v_num
        loop
          v_stars:= v_stars||'*';
        end loop;
        update scott.emp set stars= v_stars where empno=emp_rec.empno;
        end loop;
        end;
    

    截图:

     

     

  • 相关阅读:
    数据库-自定义函数
    数据库-存储过程
    数据库配置
    水电费管理系统需求分析与设计_待完善
    SQL中Group By的使用
    部分查询功能语句
    10-11数据库练习
    Oracle-SQL
    开发环境之Gradle
    解决程序端口占用
  • 原文地址:https://www.cnblogs.com/shenxiaolin/p/5517834.html
Copyright © 2020-2023  润新知