ImageVerifierCode 换一换
格式:DOC , 页数:9 ,大小:50.50KB ,
资源ID:3206135      下载积分:20 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-3206135.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(游标使用全解.doc)为本站会员(ng****60)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

游标使用全解.doc

1、- 声明游标;CURSOR cursor_name IS select_statement-For 循环游标-(1)定义游标-(2)定义游标变量-(3)使用 for 循环来使用这个游标declare-类型定义cursor c_jobisselect empno,ename,job,salfrom empwhere job=MANAGER;-定义一个游标变量 v_cinfo c_emp%ROWTYPE ,该类型为游标 c_emp 中的一行数据类型c_row c_job%rowtype;beginfor c_row in c_job loopdbms_output.put_line(c_row.e

2、mpno|-|c_row.ename|-|c_row.job|-|c_row.sal);end loop;end;-Fetch 游标-使用的时候必须要明确的打开和关闭declare -类型定义cursor c_jobisselect empno,ename,job,salfrom empwhere job=MANAGER;-定义一个游标变量c_row c_job%rowtype;beginopen c_job;loop-提取一行数据到 c_rowfetch c_job into c_row;-判读是否提取到值,没取到值就退出-取到值 c_job%notfound 是 false -取不到值 c

3、_job%notfound 是 trueexit when c_job%notfound;dbms_output.put_line(c_row.empno|-|c_row.ename|-|c_row.job|-|c_row.sal);end loop;-关闭游标close c_job;end;-1:任意执行一个 update 操作,用隐式游标 sql 的属性%found,%notfound,%rowcount,%isopen 观察 update 语句的执行情况。beginupdate emp set ENAME=ALEARK WHERE EMPNO=7469;if sql%isopen the

4、ndbms_output.put_line(Openging);elsedbms_output.put_line(closing);end if;if sql%found thendbms_output.put_line(游标指向了有效行);-判断游标是否指向有效行elsedbms_output.put_line(Sorry);end if;if sql%notfound thendbms_output.put_line(Also Sorry);elsedbms_output.put_line(Haha);end if;dbms_output.put_line(sql%rowcount);ex

5、ception when no_data_found thendbms_output.put_line(Sorry No data);when too_many_rows thendbms_output.put_line(Too Many rows);end;declareempNumber emp.EMPNO%TYPE;empName emp.ENAME%TYPE;beginif sql%isopen thendbms_output.put_line(Cursor is opinging);elsedbms_output.put_line(Cursor is Close);end if;if

6、 sql%notfound thendbms_output.put_line(No Value);elsedbms_output.put_line(empNumber);end if;dbms_output.put_line(sql%rowcount);dbms_output.put_line(-);select EMPNO,ENAME into empNumber,empName from emp where EMPNO=7499;dbms_output.put_line(sql%rowcount);if sql%isopen thendbms_output.put_line(Cursor

7、is opinging);elsedbms_output.put_line(Cursor is Closing);end if;if sql%notfound thendbms_output.put_line(No Value);elsedbms_output.put_line(empNumber);end if;exception when no_data_found thendbms_output.put_line(No Value);when too_many_rows thendbms_output.put_line(too many rows);end;-2,使用游标和 loop 循

8、环来显示所有部门的名称-游标声明declare cursor csr_deptis-select 语句select DNAMEfrom Depth;-指定行指针,这句话应该是指定和 csr_dept 行类型相同的变量row_dept csr_dept%rowtype;begin-for 循环for row_dept in csr_dept loopdbms_output.put_line(部门名称:|row_dept.DNAME);end loop;end;-3,使用游标和 while 循环来显示所有部门的的地理位置(用 %found 属性)declare-游标声明cursor csr_Tes

9、tWhileis-select 语句select LOCfrom Depth;-指定行指针row_loc csr_TestWhile%rowtype;begin-打开游标open csr_TestWhile;-给第一行喂数据fetch csr_TestWhile into row_loc;-测试是否有数据,并执行循环while csr_TestWhile%found loopdbms_output.put_line(部门地点:|row_loc.LOC);-给下一行喂数据fetch csr_TestWhile into row_loc;end loop;close csr_TestWhile;e

10、nd; select * from emp-4,接收用户输入的部门编号,用 for 循环和游标,打印出此部门的所有雇员的所有信息(使用循环游标)-CURSOR cursor_name(parameter,parameter,.) IS select_statement;-定义参数的语法如下:Parameter_name IN data_type:=|DEFAULT value declare CURSOR c_dept(p_deptNo number)isselect * from emp where emp.depno=p_deptNo;r_emp emp%rowtype;beginfor

11、r_emp in c_dept(20) loopdbms_output.put_line(员工号:|r_emp.EMPNO|员工名:|r_emp.ENAME|工资:|r_emp.SAL);end loop;end;select * from emp -5:向游标传递一个工种,显示此工种的所有雇员的所有信息( 使用参数游标)declare cursorc_job(p_job nvarchar2)is select * from emp where JOB=p_job;r_job emp%rowtype;begin for r_job in c_job(CLERK) loopdbms_output

12、.put_line(员工号|r_job.EMPNO| |员工姓名|r_job.ENAME);end loop;end;SELECT * FROM EMP-6:用更新游标来为雇员加佣金:( 用 if 实现,创建一个与 emp 表一摸一样的 emp1 表,对emp1 表进行修改操作), 并将更新前后的数据输出出来 -http:/ create table emp1 as select * from emp;declarecursorcsr_Updateisselect * from emp1 for update OF SAL;empInfo csr_Update%rowtype;saleInfo

13、 emp1.SAL%TYPE;beginFOR empInfo IN csr_Update LOOPIF empInfo.SAL0 loopdbms_output.put_line(员工姓名:|r_testComput.ENAME| 工作时间:|r_testComput.HIREDATE);-计速器减一top_two:=top_two-1;FETCH crs_testComput INTO r_testComput;end loop;close crs_testComput;end;-10:编写一个 PL/SQL 程序块,对所有雇员按他们的基本薪水(sal)的 20%为他们加薪,-如果增加的薪

14、水大于 300 就取消加薪( 对 emp1 表进行修改操作,并将更新前后的数据输出出来) declarecursorcrs_UpadateSalisselect * from emp1 for update of SAL;r_UpdateSal crs_UpadateSal%rowtype;salAdd emp1.sal%type;salInfo emp1.sal%type;beginfor r_UpdateSal in crs_UpadateSal loopsalAdd:= r_UpdateSal.SAL*0.2;if salAdd300 thensalInfo:=r_UpdateSal.S

15、AL;dbms_output.put_line(r_UpdateSal.ENAME|: 加薪失败。| 薪水维持在:|r_UpdateSal.SAL);else salInfo:=r_UpdateSal.SAL+salAdd;dbms_output.put_line(r_UpdateSal.ENAME|: 加薪成功.|薪水变为:|salInfo);end if;update emp1 set SAL=salInfo where current of crs_UpadateSal;end loop;end;-11:将每位员工工作了多少年零多少月零多少天输出出来 -近似-CEIL(n)函数:取大于等

16、于数值 n 的最小整数-FLOOR(n)函数:取小于等于数值 n 的最大整数-truc 的用法 http:/ ENAME,HIREDATE, trunc(months_between(sysdate, hiredate) / 12) AS SPANDYEARS,trunc(mod(months_between(sysdate, hiredate), 12) AS months,trunc(mod(mod(sysdate - hiredate, 365), 12) as daysfrom emp1;r_WorkDay crs_WorkDay%rowtype;beginfor r_WorkDay

17、in crs_WorkDay loopdbms_output.put_line(r_WorkDay.ENAME|已经工作了|r_WorkDay.SPANDYEARS| 年,零|r_WorkDay.months|月,零|r_WorkDay.days|天);end loop;end;-12:输入部门编号,按照下列加薪比例执行(用 CASE 实现,创建一个 emp1 表,修改 emp1表的数据),并将更新前后的数据输出出来- deptno raise(%)- 10 5%- 20 10%- 30 15%- 40 20%- 加薪比例以现有的 sal 为标准-CASE expr WHEN comparis

18、on_expr THEN return_expr-, WHEN comparison_expr THEN return_expr. ELSE else_expr ENDdeclarecursorcrs_caseTestisselect * from emp1 for update of SAL;r_caseTest crs_caseTest%rowtype;salInfo emp1.sal%type;beginfor r_caseTest in crs_caseTest loopcase when r_caseTest.DEPNO=10THEN salInfo:=r_caseTest.SAL*

19、1.05;when r_caseTest.DEPNO=20THEN salInfo:=r_caseTest.SAL*1.1;when r_caseTest.DEPNO=30THEN salInfo:=r_caseTest.SAL*1.15;when r_caseTest.DEPNO=40THEN salInfo:=r_caseTest.SAL*1.2;end case;update emp1 set SAL=salInfo where current of crs_caseTest;end loop;end;-13:对每位员工的薪水进行判断,如果该员工薪水高于其所在部门的平均薪水,则将其薪水减

20、 50 元,输出更新前后的薪水,员工姓名,所在部门编号。-AVG(distinct|all expr) over (analytic_clause)-作用:-按照 analytic_clause 中的规则求分组平均值。-分析函数语法:-FUNCTION_NAME(,.)-OVER-()-PARTITION 子句-按照表达式分区(就是分组 ),如果省略了分区子句,则全部的结果集被看作是一个单一的组select * from emp1DECLARECURSOR crs_testAvgISselect EMPNO,ENAME,JOB,SAL,DEPNO,AVG(SAL) OVER (PARTITION BY DEPNO ) AS DEP_AVGFROM EMP1 for update of SAL;r_testAvg crs_testAvg%rowtype;salInfo emp1.sal%type;beginfor r_testAvg in crs_testAvg loopif r_testAvg.SALr_testAvg.DEP_AVG thensalInfo:=r_testAvg.SAL-50;end if;update emp1 set SAL=salInfo where current of crs_testAvg;end loop;end;

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。