Oracle数据库—— 游标的创建和应用
2016-05-22 21:19
411 查看
一、涉及内容
游标的创建与应用
二、具体操作
(一)填空题
1.PL/SQL 程序块主要包含3个部分:声明部分、(执行部分 )、异常处理部分。
2.自定义异常必须使用(RAISE )语句引发。
(二)选择题
1.下列哪一个不是BOOLEAN变量可能的取值?(D )
A.TRUE B.FALSE C.NULL D.BLANK
2.请查看以下IF语句:
在执行了以上语句之后,变量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的和。
方案一:
语句:
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522205845529-637226374.png)
方案二:
语句:
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522205944560-1774963555.png)
2.分别使用显式游标和隐式游标逐行输出scott.emp表中的员工姓名和工资。
(一)使用显式游标
语句:
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522210116107-579243311.png)
(二)使用隐式游标
语句:
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522210208794-1255275872.png)
(补充练习)
1、 创建一个表top_dogs,包含两列:name varchar2(25) 和 salary NUMBER(11,2),用来存放员工姓名和工资。
语句:
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522210300560-1376667316.png)
2、创建一个PL/SQL块,查询出工资水平前n名的员工。具体要求如下:
(1)通过替代变量读取n的值。
(2)通过循环从emp表中获取工资在前n名的员工的姓名和工资
(3)将得到的员工姓名和工资写入top_dogs表。
(4)如果有多名员工的工资相同,则每人都占n名中的一个名额。
(5)测试特殊情况,例如n=0或者n大于员工总数。
(6)每次向top_dogs 表中写入数据前,先清空该表中的数据。
方案一:
语句:
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522210349169-487230563.png)
n=3以及n=4:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522210412810-758728977.png)
测试n=0以及n=100的情况:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522210728154-599397868.png)
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522210740591-797773370.png)
方案二:
语句:
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522210851544-166661305.png)
输入n:2
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522210940029-60599581.png)
输入n:3
Select * from top_dogs
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522211007451-322852657.png)
输入n:0
Select * from top_dogs
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522211025076-932837802.png)
输入n:100
Select * from top_dogs
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522211111638-1049104224.png)
3、在上题的基础上,如果员工工资相同(并列第几名),需要将前n名的员工全部输出。
语句:
输入n 的值:2
Select * from top_dogs
有三条记录
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522211407216-1930936190.png)
4、使用游标查询dept表的部门编号和名称,将其部门编号传递给另一个用于查询emp表的游标(查询emp表的员工姓名,工作,雇佣日期,工资)。
语句:
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522211542373-515869984.png)
5、为emp表增加一个列stars,类型为VARCHAR2(100)。使用游标更新stars列:创建一个PL/SQL块,根据员工的工资计算他能获得的星号“*”数量,每100美元奖励一个星号,按四舍五入处理。并根据员工所获得的星号数量n,形成由n个星号组成的字符串,写入emp表的stars列。
(1)为emp表增加一个列stars,类型为VARCHAR2(100)。
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522211636826-932771324.png)
(2)使用游标更新stars列:
语句:
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522211725279-1778383226.png)
游标的创建与应用
二、具体操作
(一)填空题
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; /
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522205845529-637226374.png)
方案二:
语句:
Declare v_sum integer; begin v_sum := 100*101/2; dbms_output.put_line(‘1~100的和为:’|| v_sum); end; /
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522205944560-1774963555.png)
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;
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522210116107-579243311.png)
(二)使用隐式游标
语句:
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;
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522210208794-1255275872.png)
(补充练习)
1、 创建一个表top_dogs,包含两列:name varchar2(25) 和 salary NUMBER(11,2),用来存放员工姓名和工资。
语句:
create table top_dogs (name varchar2(25), salary NUMBER(11,2));
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522210300560-1376667316.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 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; /
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522210349169-487230563.png)
n=3以及n=4:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522210412810-758728977.png)
测试n=0以及n=100的情况:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522210728154-599397868.png)
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522210740591-797773370.png)
方案二:
语句:
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; /
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522210851544-166661305.png)
输入n:2
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522210940029-60599581.png)
输入n:3
Select * from top_dogs
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522211007451-322852657.png)
输入n:0
Select * from top_dogs
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522211025076-932837802.png)
输入n:100
Select * from top_dogs
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522211111638-1049104224.png)
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
有三条记录
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522211407216-1930936190.png)
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; /
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522211542373-515869984.png)
5、为emp表增加一个列stars,类型为VARCHAR2(100)。使用游标更新stars列:创建一个PL/SQL块,根据员工的工资计算他能获得的星号“*”数量,每100美元奖励一个星号,按四舍五入处理。并根据员工所获得的星号数量n,形成由n个星号组成的字符串,写入emp表的stars列。
(1)为emp表增加一个列stars,类型为VARCHAR2(100)。
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522211636826-932771324.png)
(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;
截图:
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522211725279-1778383226.png)
![](https://images2015.cnblogs.com/blog/818082/201605/818082-20160522211752638-158267280.png)
相关文章推荐
- Oracle数据库—— PL/SQL进阶编程
- oracle 安装心得记录
- Oracle数据库—— PL/SQL基础编程
- Navicat连接Oracle11g 错误的解决办法
- 谷歌大战甲骨文,没想到这么污!
- Oracle开发实战-日期函数
- 初学者之ORACLE生成执行计划
- Oracle开发实战-字符函数
- oracle数据库varchar2大字段中的换行、空格如何在jsp页面中展示
- Oracle中的位图索引是什么?
- Oracle基本操作
- Oracle内连接、外连接、右外连接、全外连接小总结
- ORA-28002:怎样使oracle数据库密码永不过期
- oracle linux 5.9 不支持 acfs 文件系统 怎么解决呢?
- hibernate正向工程连接Oracle数据库的配置文件
- ORACLE 10.2.0.1 ,10gr2 rac 搭建步骤详细
- 高级SQL优化(二) ——《12年资深DBA教你Oracle开发与优化——性能优化部分》
- oracle 客户端可以连接11g rac vip 但是不能连接scan ip问题
- Oracle VM VirtualBox UUID already exists 问题解决
- oracle dg相关参数