Oracle 游标的练习

--1、什么是游标?使用游标的基本步骤是什么? 
/*
挡在PL/SQL块中执行查询语句(SELECT)和数据操纵语句(DML)时,
Oracle会在内存中分配一个缓冲区,缓冲区中包含了处理过程的必需信息,
包括已经处理完的行数、指向被分析行的指针和查询情况下的活动集,即查询语句返回的数据行集。
该缓冲区域称为上下文区,游标是指向该缓冲区的句柄或指针。
*/


--2、游标有哪几种类型?分别在什么情况下使用? 
/*
(1)显式游标:由用户定义、操作,用于处理返回多行数据的SELECT查询。
(2)隐式游标:由系统自动进行操作,用于处理DML语句和返回单行数据的SELECT查询。
*/


--3、用游标显示所有部门编号与名称,以及其所拥有的员工人数。
--方法一
declare
cursor c_emp is select * from emp;
cursor c_dept is select * from dept;
v_count number;
begin
for v_dept in c_dept loop
v_count := 0;
for v_emp in c_emp loop
if v_emp.deptno = v_dept.deptno then
v_count := v_count + 1;
end if;
end loop;
dbms_output.put_line('编号:' || v_dept.deptno || '是:' || 
v_dept.dname || '部门,共有员工' || v_count || '人。');
end loop;
end;
--方法二:(PS:缺失没有员工的部门)
declare
cursor c_temp is (select deptno, dname, count(*) count_p
from (select d.deptno, d.dname
from dept d
join emp e on d.deptno = e.deptno) t
group by deptno, dname);
begin
for v_temp in c_temp loop
dbms_output.put_line(v_temp.deptno || '-' || v_temp.dname || '-' || v_temp.count_p);
end loop;
end;


--4、用游标属性%rowcount实现输出前十个员工的信息。
declare
cursor c is (select * from emp);
begin
for v in c loop
if c%rowcount<=10 then
dbms_output.put_line(c%rowcount || '-' || v.empno || '-' || v.ename || '-' || v.sal);
else exit;
end if;
end loop;
end;


--5、通过使用游标来显示dept表中的部门名称,及其相应的员工列表(提示:可以使用双重循环)。
declare
cursor c_emp is select * from emp;
cursor c_dept is select * from dept;
begin
for v_dept in c_dept loop
dbms_output.put_line( v_dept.dname || ' 部门人员列表:');
for v_emp in c_emp loop
if v_emp.deptno = v_dept.deptno then
dbms_output.put_line('    ' || v_emp.ename);
end if;
end loop;
dbms_output.put_line('');
end loop;
end;


--6、接受一个部门号,使用For循环,从emp表中显示该部门的所有雇员的姓名,工作和薪水。
declare
cursor c_emp is select * from emp where deptno = &please_enter_deptno;
v_dept dept%rowtype;
begin
select * into v_dept from dept where  deptno = &please_enter_deptno;
dbms_output.put_line(&please_enter_deptno || ' :: ' || v_dept.dname);
dbms_output.put_line('');
dbms_output.put_line('ename :: job :: sal');
for v_emp in c_emp loop
dbms_output.put_line(v_emp.ename || ' :: ' || v_emp.job || ' :: ' || v_emp.sal);
end loop;
end;


--7、编写一个程序块,将emp表中前5人的名字,及其出的工资等级(salgrade)显示出来。
begin
for v_emp in (select e.ename, s.grade
from emp e
join salgrade s on e.sal between s.losal and s.hisal where rownum < =5) loop
dbms_output.put_line(v_emp.ename || ' :: grade ' || v_emp.grade);
end loop;
end;


--8、用带参数的游标输出部门编号为10, 30的员工信息。
declare
cursor c_emp(v_deptno dept.deptno%type) is select * from emp where deptno = v_deptno;
begin
dbms_output.put_line('部门编号为:10 的员工列表');
for v_emp in c_emp(10) loop
dbms_output.put_line(v_emp.ename);
end loop;
dbms_output.put_line('部门编号为:30 的员工列表');
for v_emp in c_emp(30) loop
dbms_output.put_line(v_emp.ename);
end loop;
end;


--9、使用带参数的游标,实现接受一个部门名称,从emp表中显示该部门的所有雇员的姓名,工作和薪水。
declare
cursor c_emp(v_dname dept.dname%type) is select * from emp where deptno = (select deptno from dept where dname = v_dname);
begin
dbms_output.put_line('SALES 部门员工名单:');
for v_emp in c_emp('SALES') loop
dbms_output.put_line(v_emp.ename || ' :: ' || v_emp.job || ' :: ' || v_emp.sal);
end loop;
end;


--10、用游标获取所有收入超过2000的 salesman.
declare
cursor c_emp is select * from emp;
begin
dbms_output.put_line('收入超过1500的SALESMAN列表:');
--收入超过2000的salesman没有数据
for v_emp in c_emp loop
if v_emp.job = 'SALESMAN' and v_emp.sal > 1500 then
dbms_output.put_line(v_emp.ename || ' :: ' || v_emp.sal);
end if;
end loop;
end;


--11、编写一个PL/SQL程序块,从emp表中对名字以"A"或"S"开始的所有雇员按他们基本薪水的10%给他们加薪。
declare
cursor c_emp is select * from emp2 for update;
begin
for v_emp in c_emp loop
if substr(v_emp.ename,1,1) = 'A' or substr(v_emp.ename,1,1) = 'S' then
dbms_output.put_line('加薪员工:' || v_emp.ename || '加薪:' || v_emp.sal*0.1);
update emp2 set sal = sal*1.1 where ename = v_emp.ename;
end if;
end loop;
commit;
end;


--12、emp表中对所有雇员按他们基本薪水的10%给他们加薪,如果所增加后的薪水大于5000,则取消加薪。
begin
for v_emp in (select ename,sal,empno from emp2) loop
if v_emp.sal*1.1 < 5000 then
dbms_output.put_line('待加薪的员工:' || v_emp.ename);
update emp2 set sal = sal * 1.1 where empno = v_emp.empno;
end if;
end loop;
commit;
end;


--13、按照salgrade表中的标准,给员工加薪,1:5%,2:4%,3:3%,4:2%,5:1%, 
--并打印输出每个人,加薪前后的工资。
--方法一
declare
cursor c_emp is(
select ename, sal, grade
from emp2 e
join salgrade s on e.sal between s.losal and s.hisal) order by ename;
begin
for v_emp in c_emp loop
update emp2 set sal = sal * (1+((6 - v_emp.grade)*0.01)) where emp2.ename = v_emp.ename;
dbms_output.put_line(v_emp.ename || ',加薪前:' || v_emp.sal || ',等级:' || 
v_emp.grade || ',加薪后:' || v_emp.sal * (1+((6 - v_emp.grade)*0.01)));
end loop;
commit;
end;
--方法二
declare
cursor c_emp is(
select ename, sal, grade
from emp2 e
join salgrade s on e.sal between s.losal and s.hisal) order by ename;
begin
for v_emp in c_emp loop
case v_emp.grade
when 1 then
update emp2 set sal = sal * (1+0.05) where emp2.ename = v_emp.ename;
when 2 then
update emp2 set sal = sal * (1+0.04) where emp2.ename = v_emp.ename;
when 3 then
update emp2 set sal = sal * (1+0.03) where emp2.ename = v_emp.ename;
when 4 then
update emp2 set sal = sal * (1+0.02) where emp2.ename = v_emp.ename;
when 5 then
update emp2 set sal = sal * (1+0.01) where emp2.ename = v_emp.ename;
else null;
end case;
/*dbms_output.put_line(v_emp.ename || ',加薪前:' || v_emp.sal || ',等级:' || 
v_emp.grade || ',加薪后:' || v_emp.sal * (1+((6 - v_emp.grade)*0.01)));*/
end loop;
commit;
end;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集合使用与内部实现原理

集合类型 (Set) 是一个无序并唯一的键值集合。 之所以说集合类型是一个无序集合,是因为它的存储顺序不会按照插入的先后顺序进行存储,如下代码所示: 127.0.0.1:6379> sadd myset v2 v1 v3 #插入数据 v2、v1、v3 (integer) 3 127.0.0.1:6379> smembers myset #查询数…

parse 日期_日期parse()方法以及JavaScript中的示例

parse 日期JavaScript Date parse()方法 (JavaScript Date parse() method) parse() method is a Date class method, it is used to parse a given date string and returns the total number of milliseconds since 01st January 1970 (midnight) to given date string. pars…

ORA-01002 提取违反顺序

ORA-01002 提取违反顺序 ORA-01002 ORA-01002: fetch out of sequence Cause: This error means that a fetch has been attempted from a cursor which is no longer valid. Note that a PL/SQL cursor loop implicitly does fetches, and thus may also cause this error. Th…

Android 友盟SDK 终极解决报错:SocialSDK_QQZone_2.jar contains native libraries that

转自&#xff1a;http://bbs.umeng.com/thread-6552-1-2.html 报错信息&#xff1a;The library SocialSDK_QQZone_2.jar contains native libraries that will not run on the device.解决方案&#xff1a;此问题和Eclipse环境有关&#xff0c;按照如下步骤操作即可Eclipse-&g…

Redis 持久化——AOF

使用 RDB 持久化有一个风险,它可能会造成最新数据丢失的风险。因为 RDB 的持久化有一定的时间间隔,在这个时间段内如果 Redis 服务意外终止的话,就会造成最新的数据全部丢失。 可能会操作 Redis 服务意外终止的条件: 安装 Redis 的机器停止运行,蓝屏或者系统崩溃;安装 R…

数组的fill方法_数组fill()方法以及JavaScript中的示例

数组的fill方法JavaScript fill()方法 (JavaScript fill() method) fill() method is used fill the array with a given value. fill()方法用于使用给定值填充数组。 Syntax: 句法&#xff1a; array.fill(value, [start_index], [end_index]);Parameters: 参数&#xff1a…

第四章文件管理

第四章文件管理4.1_2初识文件4.1_2文件的逻辑结构无结构文件有结构文件&#xff08;1&#xff09;顺序文件&#xff08;2&#xff09;索引文件索引顺序文件多级索引顺序文件4.1_3文件目录文件控制块FCB&#xff08;2&#xff09;单级目录&#xff08;3&#xff09;两级目录结构…

current of 使用

--Where Current Of语句允许你更新或者是删除最后由cursor取的记录declarecursor c_emp is select * from emp2 for update;beginfor v_emp in c_emp loopif substr(v_emp.ename,1,1)S thenupdate emp2 set comm nvl(comm,0)1000 where current of c_emp;end if;end loop;comm…

免费的管理页面模板

2019独角兽企业重金招聘Python工程师标准>>> Free Bootstrap Admin Templates for Designers 1. Admin Lite AdminLTE - 是一个完全响应式管理模板。基于Bootstrap3的框架。高度可定制的&#xff0c;易于使用。支持很多的屏幕分辨率适合从小型移动设备到大型台式机。…

Redis 持久化——RDB

Redis 的读写都是在内存中,所以它的性能较高,但在内存中的数据会随着服务器的重启而丢失,为了保证数据不丢失,我们需要将内存中的数据存储到磁盘,以便 Redis 重启时能够从磁盘中恢复原有的数据,而整个过程就叫做 Redis 持久化。 Redis 持久化也是 Redis 和 Memcached 的主…

c# 命名空间命名规范_C#命名空间能力问题和解答 套装2

c# 命名空间命名规范1) Can we create a nested namespace in C#.NET? YesNo Answer & Explanation Correct answer: 1Yes Yes, we can create a nested namespace in C#.NET. 1)我们可以在C&#xff03;.NET中创建嵌套的名称空间吗&#xff1f; 是 没有 答案与解释 正确…

MATLAB使用教程

MATLAB使用教程2.1.1 MATLAB系统环境&#xff08;1&#xff09;命令行窗口&#xff08;2&#xff09;工作区窗口2.2.1MATLAB数值数据&#xff08;1&#xff09;强制转换如转换为int整形&#xff08;2&#xff09;判断变量类型&#xff08;3&#xff09;复型&#xff08;4&#…

Oracle笔记:循环及游标

循环及退出循环&#xff1a; --while--初值while 条件loop循环体;循环变量的变化;end loop;--breakif 条件 thenexit;end if;--continue<<label>>....if 条件 thengoto label;end if; --例declarei integer;j integer;begin j:1;<<b>> while j<9l…

Redis 事务深入解析

作为关系型数据库中一项非常重要的基础功能——事务,在 Redis 中是如何处理并使用的? 前言 事务指的是提供一种将多个命令打包,一次性按顺序地执行的机制,并且保证服务器只有在执行完事务中的所有命令后,才会继续处理此客户端的其他命令。 事务也是其他关系型数据库所必…

Java Thread类的最终void join()方法与示例

线程类最终void join() (Thread Class final void join()) This method is available in package java.lang.Thread.join(). 软件包java.lang.Thread.join()中提供了此方法。 join() method is applicable when a thread wants to wait until completing some other thread the…

解决myeclipse中新导入的工程旁出现红色感叹号的问题

2019独角兽企业重金招聘Python工程师标准>>> 或许很多像我这样的java初学者在使用myeclipse时出现新导入的工程旁边有红色的感叹号。 1.问题一般就是java build path 设置不正确的问题。解决步骤如下&#xff1a; 右击工程找到Build Path——>Configure Build Pa…

层次分析法

层次分析法一、层次分析法原理二、解题步骤&#xff08;1&#xff09;层次结构模型&#xff08;2&#xff09;成对比较矩阵①成对比较矩阵&#xff08;有现成代码进行一致性检验和求权重&#xff09;②成对比较阵标度表及举例③一致性检验三、旅游性问题举例&#xff08;1&…

ORA-00997: 非法使用 LONG 数据类型

今天在创建表的时候直接用的create table XXX as select * from AAA;结果出了一个&#xff1a;ORA-00997: 非法使用 LONG 数据类型 的错误。后来查了一下&#xff0c;做下笔记&#xff1a;1、select查询语句中用到where 语句和排序时不能直接 使用数据类型为long的字段&#xf…

Redis 持久化——混合持久化

RDB 和 AOF 持久化各有利弊,RDB 可能会导致一定时间内的数据丢失,而 AOF 由于文件较大则会影响 Redis 的启动速度,为了能同时使用 RDB 和 AOF 各种的优点,Redis 4.0 之后新增了混合持久化的方式。 在开启混合持久化的情况下,AOF 重写时会把 Redis 的持久化数据,以 RDB 的…

Java ObjectInputStream readDouble()方法与示例

ObjectInputStream类readChar()方法 (ObjectInputStream Class readChar() method) readChar() method is available in java.io package. readChar()方法在java.io包中可用。 readChar() method is used to read 2 byte (i.e. 16 bit) of character from this ObjectInputStre…