oracle的PLSQL编程之过程全部案例.docx

上传人:asd****56 文档编号:70331274 上传时间:2023-01-19 格式:DOCX 页数:9 大小:18.16KB
返回 下载 相关 举报
oracle的PLSQL编程之过程全部案例.docx_第1页
第1页 / 共9页
oracle的PLSQL编程之过程全部案例.docx_第2页
第2页 / 共9页
点击查看更多>>
资源描述

《oracle的PLSQL编程之过程全部案例.docx》由会员分享,可在线阅读,更多相关《oracle的PLSQL编程之过程全部案例.docx(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、- 声明游标;CURSOR cursor_name IS select_statement-For 循环游标-(1)定义游标-(2)定义游标变量-(3)使用for循环来使用这个游标declare -类型定义 cursor c_job is select empno,ename,job,sal from emp where job=MANAGER; -定义一个游标变量v_cinfo c_emp%ROWTYPE ,该类型为游标c_emp中的一行数据类型 c_row c_job%rowtype;begin for c_row in c_job loop dbms_output.put_line(c_

2、row.empno|-|c_row.ename|-|c_row.job|-|c_row.sal); end loop;end; -Fetch游标-使用的时候必须要明确的打开和关闭declare -类型定义 cursor c_job is select empno,ename,job,sal from emp where job=MANAGER; -定义一个游标变量 c_row c_job%rowtype;begin open c_job; loop -提取一行数据到c_row fetch c_job into c_row; -判读是否提取到值,没取到值就退出 -取到值c_job%notfoun

3、d 是false -取不到值c_job%notfound 是true exit 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语句的执行情况。 begin update emp set ENAME=ALEARK WHERE EMPNO=7469; if

4、 sql%isopen then dbms_output.put_line(Openging); else dbms_output.put_line(closing); end if; if sql%found then dbms_output.put_line(游标指向了有效行);-判断游标是否指向有效行 else dbms_output.put_line(Sorry); end if; if sql%notfound then dbms_output.put_line(Also Sorry); else dbms_output.put_line(Haha); end if; dbms_ou

5、tput.put_line(sql%rowcount); exception when no_data_found then dbms_output.put_line(Sorry No data); when too_many_rows then dbms_output.put_line(Too Many rows); end;declare empNumber emp.EMPNO%TYPE; empName emp.ENAME%TYPE; begin if sql%isopen then dbms_output.put_line(Cursor is opinging); else dbms_

6、output.put_line(Cursor is Close); end if; if sql%notfound then dbms_output.put_line(No Value); else dbms_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%rowc

7、ount); if sql%isopen then dbms_output.put_line(Cursor is opinging); else dbms_output.put_line(Cursor is Closing); end if; if sql%notfound then dbms_output.put_line(No Value); else dbms_output.put_line(empNumber); end if; exception when no_data_found then dbms_output.put_line(No Value); when too_many

8、_rows then dbms_output.put_line(too many rows); end; -2,使用游标和loop循环来显示所有部门的名称-游标声明declare cursor csr_dept is -select语句 select DNAME from Depth; -指定行指针,这句话应该是指定和csr_dept行类型相同的变量 row_dept csr_dept%rowtype;begin -for循环 for row_dept in csr_dept loop dbms_output.put_line(部门名称:|row_dept.DNAME); end loop;e

9、nd;-3,使用游标和while循环来显示所有部门的的地理位置(用%found属性)declare -游标声明 cursor csr_TestWhile is -select语句 select LOC from Depth; -指定行指针 row_loc csr_TestWhile%rowtype;begin -打开游标 open csr_TestWhile; -给第一行喂数据 fetch csr_TestWhile into row_loc; -测试是否有数据,并执行循环 while csr_TestWhile%found loop dbms_output.put_line(部门地点:|ro

10、w_loc.LOC); -给下一行喂数据 fetch csr_TestWhile into row_loc; end loop; close csr_TestWhile;end; 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_d

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

12、* from emp where JOB=p_job; r_job emp%rowtype;begin for r_job in c_job(CLERK) loop dbms_output.put_line(员工号|r_job.EMPNO| |员工姓名|r_job.ENAME); end loop;end;SELECT * FROM EMP-6:用更新游标来为雇员加佣金:(用if实现,创建一个与emp表一摸一样的emp1表,对emp1表进行修改操作),并将更新前后的数据输出出来 - create table emp1 as select * from emp; declare cursor c

13、sr_Update is select * from emp1 for update OF SAL; empInfo csr_Update%rowtype; saleInfo emp1.SAL%TYPE;begin FOR empInfo IN csr_Update LOOP IF empInfo.SAL1500 THEN saleInfo:=empInfo.SAL*1.2; elsif empInfo.SAL2000 THEN saleInfo:=empInfo.SAL*1.5; elsif empInfo.SAL0 loop dbms_output.put_line(员工姓名:|r_tes

14、tComput.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%为他们加薪,-如果增加的薪水大于300就取消加薪(对emp1表进行修改操作,并将更新前后的数据输出出来) declare cursor crs_UpadateSal is select * from emp1 for upd

15、ate of SAL; r_UpdateSal crs_UpadateSal%rowtype; salAdd emp1.sal%type; salInfo emp1.sal%type;begin for r_UpdateSal in crs_UpadateSal loop salAdd:= r_UpdateSal.SAL*0.2; if salAdd300 then salInfo:=r_UpdateSal.SAL; dbms_output.put_line(r_UpdateSal.ENAME|: 加薪失败。|薪水维持在:|r_UpdateSal.SAL); else salInfo:=r_U

16、pdateSal.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)函数:取大于等于数值n的最小整数 -FLOOR(n)函数:取小于等于数值n的最大整数 -truc的用法 declare cursor crs_WorkDay is select ENAM

17、E,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 days from emp1; r_WorkDay crs_WorkDay%rowtype;begin for r_WorkDay in crs_WorkDay loop dbms_output.put_line(r_WorkDay.ENA

18、ME|已经工作了|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 comparison_expr THEN return_expr-, WHEN comparison_expr THEN return

19、_expr. ELSE else_expr ENDdeclare cursor crs_caseTest is select * from emp1 for update of SAL; r_caseTest crs_caseTest%rowtype; salInfo emp1.sal%type; begin for r_caseTest in crs_caseTest loop case when r_caseTest.DEPNO=10 THEN salInfo:=r_caseTest.SAL*1.05; when r_caseTest.DEPNO=20 THEN salInfo:=r_ca

20、seTest.SAL*1.1; when r_caseTest.DEPNO=30 THEN salInfo:=r_caseTest.SAL*1.15; when r_caseTest.DEPNO=40 THEN salInfo:=r_caseTest.SAL*1.2; end case; update emp1 set SAL=salInfo where current of crs_caseTest; end loop;end;-13:对每位员工的薪水进行判断,如果该员工薪水高于其所在部门的平均薪水,则将其薪水减50元,输出更新前后的薪水,员工姓名,所在部门编号。-AVG(distinct|

21、all expr) over (analytic_clause)-作用:-按照analytic_clause中的规则求分组平均值。 -分析函数语法: -FUNCTION_NAME(,.) -OVER -() -PARTITION子句 -按照表达式分区(就是分组),如果省略了分区子句,则全部的结果集被看作是一个单一的组 select * from emp1DECLARE CURSOR crs_testAvg IS select EMPNO,ENAME,JOB,SAL,DEPNO,AVG(SAL) OVER (PARTITION BY DEPNO ) AS DEP_AVG FROM EMP1 for update of SAL; r_testAvg crs_testAvg%rowtype; salInfo emp1.sal%type; begin for r_testAvg in crs_testAvg loop if r_testAvg.SALr_testAvg.DEP_AVG then salInfo:=r_testAvg.SAL-50; end if; update emp1 set SAL=salInfo where current of crs_testAvg; end loop;end;2012年8月30日星期四太平洋保险lzc

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁