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

一、涉及内容

游标的创建与应用

二、具体操作

(一)填空题

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

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

(二)选择题

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

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

2.请查看以下IF语句:

Declaresalnumber:=500;

commnumber;Begin

If sal <100 thenComm :=0;

Elsif sal<600 thenComm:=sal*0.1;Else sal <1000 thenComm:=sal*0.15;ElseComm:=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错误之间建立关联时,应该在哪个部分完成?(C)

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

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

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

(三)编程题

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

方案一:

语句:

Declarev_suminteger:=0;begin

for i in 1..100loop

v_sum := v_sum+i;endloop;

dbms_output.put_line(‘1~100的和为:’||v_sum);end;/

截图:

4ea7d1efde54ef461cd5c86f007bebfd.png

方案二:

语句:

Declarev_suminteger;beginv_sum := 100*101/2;

dbms_output.put_line(‘1~100的和为:’||v_sum);end;/

截图:

851e3ff82e662c3efda52b42eaeb2273.png

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

(一)使用显式游标

语句:

DECLARE

CURSOR emp_cursor01 IS SELECT ename,sal FROMscott.emp;

emp_record emp_cursor01%ROWTYPE;BEGIN

OPENemp_cursor01 ;

LOOPFETCH emp_cursor01 INTOemp_record;EXIT WHEN emp_cursor01%NOTFOUND;

dbms_output.put_line(‘ename:‘||emp_record.ename||‘,sal:‘||emp_record.sal);ENDLOOP;

dbms_output.put_line(‘row count:‘||emp_cursor01%rowcount);CLOSEemp_cursor01;END;

截图:

f5fac706135254051490f97668182945.png

(二)使用隐式游标

语句:

BEGIN

FOR emp_record IN (SELECT ename,sal FROMscott.emp)

LOOP

dbms_output.put_line(‘ename:‘||emp_record.ename||‘,sal:‘||emp_record.sal);ENDLOOP;END;

截图:

1ff8a5e7af64254c2860bb591e90931c.png

(补充练习)

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

语句:

create tabletop_dogs

(namevarchar2(25),

salaryNUMBER(11,2));

截图:

9206276d7510d8148775523a331cfd1d.png

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 FROMscott.empORDER BY sal DESC;

v_ninteger := &n;BEGIN

delete fromtop_dogs;FOR rec INemp_cursor(v_n) LOOPIF 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 thendbms_output.put_line(‘error!‘);ELSE EXIT; --退出循环

END IF;ENDLOOP;END;/

截图:

8de4ff48beab2c18308707e5d997c6ee.png

n=3以及n=4:

d76659e263a28d3bb34a87710ad2839d.png

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

ead95e0daf242af5b8f3857db5672503.png     

77dae0143d14dd9c603cb5ac43266ade.png

方案二:

语句:

DECLARE

CURSOR emp_cursor IS SELECT ename,sal FROMscott.empORDER BY sal DESC;

v_ninteger := &n;BEGIN

delete fromtop_dogs;FOR rec INemp_cursor

LOOPExit 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);

ENDLOOP;END;/

截图:

296b2e8fcf64240838c023c4df2bad76.png

输入n:2

8ab155fca29a6517e7241ddbf149e3c4.png

输入n:3

Select * from top_dogs

862f6945329b74bb7020cea420964104.png

输入n:0

Select * from top_dogs

d5377d668795a48087fbf6d5b921cced.png

输入n:100

Select * from top_dogs

41776e37c9bad1de8268562f21f299e8.png

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

语句:

DECLARE

CURSOR emp_cursor IS SELECT ename,sal FROMscott.empORDER BY sal DESC;

v_ninteger := &n;

v_sal scott.emp.sal%type;BEGIN

delete fromtop_dogs;FOR rec INemp_cursor

LOOPExit 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);

ENDLOOP;END;

输入n 的值:2

Select * from top_dogs

有三条记录

截图:

9ac98c0770ebbd8de188fa36380c9f4c.png

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

语句:

Declare

Cursor dept_cur is select deptno,dname fromscott.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 indept_cur

LoopOpenemp_cur(dept_rec.deptno);

LoopFetch emp_cur intoEmp_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);Endloop;Closeemp_cur;Endloop;End;/

截图:

6298d7400beb193940810b6b3c723933.png

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

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

bfff88064763e1874e8376367c2bab32.png

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

语句:

Declarev_stars scott.emp.stars%type;

v_numnumber:=0;Cursor c1 is select empno,sal,stars fromscott.emp;Begin

For emp_rec inc1

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||‘*‘;endloop;update scott.emp set stars= v_stars where empno=emp_rec.empno;endloop;end;

截图:

8600fe58cad0b7ca5024a539bb50e59d.png

4c1774e83e1365cac1afc9577702e42e.png

原文:http://www.cnblogs.com/shenxiaolin/p/5517834.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值