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;
截图:


Oracle数据库—— 游标的创建和应用的更多相关文章
- 《Oracle Database 12c DBA指南》第二章 - 安装Oracle和创建数据库(2.1 安装Oracle数据库软件和创建数据库概览)
当前关于12c的中文资料比较少,本人将关于DBA的一部分官方文档翻译为中文,很多地方为了帮助中国网友看懂文章,没有按照原文句式翻译,翻译不足之处难免,望多多指正. 2.1 安装Oracle数据库软件和 ...
- Spotlight监控Oracle数据库的链接创建
最近在做性能测试时,由于要挂载空间数据,开发人员直接将所有业务表都挂到了Oracle数据库中.最近做了几次测试发现响应时间和吞吐量都不是很理想,进行一番分析后怀疑可能在Oracle中出现问题,因此再网 ...
- Oracle数据库体系结构及创建表结构
Oracle服务器主要由实例.数据库.程序全局区和前台进程组成,其中实例就是用来提供管理数据库的功能:数据库由数据库文件组成,用来存储系统数据:实例可以进一步划分为系统全局区(SGA)和后台进程(PM ...
- Oracle数据库——触发器的创建与应用
一.涉及内容 1.理解触发器的概念.作用和类型. 2.练习触发器的创建和使用. 二.具体操作 (实验) 1.利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数 ...
- 设置ORACLE数据库游标大小
先用超级管理员(sys)登陆服务器: sqlplus "sys/***@orcl as sysdba" 连接到:Oracle 查看ORACLE最大游标数: SQL> show ...
- Oracle数据库游标的类型
游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.Oracle数据库的Cursor类型包含三种: 静态游标:分为显式(explicit)游标 ...
- oracle 数据库中(创建、解锁、授权、删除)用户
上文我们已经建立了名为orcl66的数据库. 想要在数据库中创建.修改用户需要我们以管理员权限登录到数据库中. 首先我们通过sqlplus命令登录连接数据库. 输入sqlplus命令--用户名: sy ...
- 基于oracle数据库存储过程的创建及调用
1.PLSQL编程 1.1概念和目的 PL/SQL(Procedure Language/SQL) PLSQL是Oracle对sql语言的过程化扩展 指在SQL命令语言中增加了过程处理语句(如分支.循 ...
- Oracle数据库游标,序列,存储过程,存储函数,触发器
游标的概念: 游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理, ...
随机推荐
- 简单实现web单点登录
主要参考文档:http://blog.csdn.net/jimmy609/article/details/18605781 1.工程总体结构: 2.修改C:\Windows\System32\driv ...
- IIS6的session丢失问题
解决办法: a IIS6中相比IIS5增加了一个应用程序池,默认是使用DefaultAppPool. b 先为站点建立一个应用程序池,打开IIS管理器,右键点击应用程序池-新建 ...
- iOS探索:对NSArray中自定义的对象进行排序
http://mobile.51cto.com/hot-434804.htm 我们开发的每个程序都会使用到一些数据,而这些数据一般被封装在一个自定义的类中.例如一个音乐程序可能会有一个Song类,聊天 ...
- 开源软件项目管理系统招设计/开发。。。。。Zend Framework2架构 svn://735.ikwb.com/pms
开源软件项目管理系统招设计/开发.....Zend Framework2架构svn://735.ikwb.com/pms
- PHP中的数组(一)
一.数组的概述 1.数组的本质:管理和操作一组变量 2.数组是复合类型 3.数组中可以存储任意长度的数据,也可以存储任意类型的数据 4.数组就可以完成其它语言数据结构的功能(链 ...
- 20135214万子惠 (2)——-Java面向对象程序设计
实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 (一)单元测试 (1) 三种 ...
- hdu 3172
http://acm.hdu.edu.cn/showproblem.php?pid=3172 题意:输出每对朋友的关系网大小 并查集的时候维护一个数组记录根节点的大小即可,水题,这题坑在T组数据这个也 ...
- E - 今年暑假不AC
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Des ...
- Java Super 覆盖方法
子类从父类中继承方法,有时候,子类需要修改父类中定义的方法的实现,这称作方法覆盖. 比如,GeometricObject类中的toString方法返回表示集合对象的字符串,这个方法就可以被覆盖,返回表 ...
- Core Java Volume I — 4.4. Static Fields and Methods
4.4. Static Fields and MethodsIn all sample programs that you have seen, the main method is tagged w ...