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个工作日内予以改正。