oracle中存储过程如何使用
今天就跟大家聊聊有关oracle中存储过程如何使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
一. 使用for循环游标:遍历所有职位为经理的雇员
1. 定义游标(游标就是一个小集合)
2. 定义游标变量
3. 使用for循环游标
declare--定义游标c_jobcursorc_jobisselectempno,ename,job,salfromempwherejob='MANAGER';--定义游标变量c_rowc_rowc_job%rowtype;begin--循环游标,用游标变量c_row存循环出的值forc_rowinc_jobloopdbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);endloop;end;
二. fetch游标:遍历所有职位为经理的雇员
使用的时候必须明确的打开和关闭
declare--定义游标c_jobcursorc_jobisselectempno,ename,job,salfromempwherejob='MANAGER';--定义游标变量c_rowc_rowc_job%rowtype;beginopenc_job;loop--提取一行数据到c_rowfetchc_jobintoc_row;--判读是否提取到值,没取到值就退出exitwhenc_job%notfound;dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);endloop;--关闭游标closec_job;end;
三. 使用游标和while循环:遍历所有部门的地理位置
--3,使用游标和while循环来显示所有部门的的地理位置(用%found属性)declare--声明游标cursorcsr_TestWhileisselectlocfromdept;--指定行指针row_loccsr_TestWhile%rowtype;beginopencsr_TestWhile;--给第一行数据fetchcsr_TestWhileintorow_loc;--测试是否有数据,并执行循环whilecsr_TestWhile%foundloopdbms_output.put_line('部门地点:'||row_loc.LOC);--给下一行数据fetchcsr_TestWhileintorow_loc;endloop;closecsr_TestWhile;end;
四. 带参的游标:接受用户输入的部门编号
declare--带参的游标cursorc_dept(p_deptNonumber)isselect*fromempwhereemp.deptno=p_deptNo;r_empemp%rowtype;beginforr_empinc_dept(20)loopdbms_output.put_line('员工号:'||r_emp.EMPNO||'员工名:'||r_emp.ENAME||'工资:'||r_emp.SAL);endloop;end;
五. 加锁的游标:对所有的salesman增加佣金500
declare--查询数据,加锁(forupdateof)cursorcsr_addComm(p_jobnvarchar2)isselect*fromempwherejob=p_jobforupdateofcomm;r_addCommemp%rowtype;commInfoemp.comm%type;beginforr_addCommincsr_addComm('SALESMAN')loopcommInfo:=r_addComm.comm+500;--更新数据(wherecurrentof)updateempsetcomm=commInfowherecurrentofcsr_addComm;endloop;end;
六. 使用计数器:找出两个工作时间最长的员工
declarecursorcrs_testComputisselect*fromemporderbyhiredateasc;--计数器top_twonumber:=2;r_testComputcrs_testComput%rowtype;beginopencrs_testComput;fetchcrs_testComputintor_testComput;whiletop_two>0loopdbms_output.put_line('员工姓名:'||r_testComput.ename||'工作时间:'||r_testComput.hiredate);--计速器减1top_two:=top_two-1;fetchcrs_testComputintor_testComput;endloop;closecrs_testComput;end;
七. if/else判断:对所有员工按基本薪水的20%加薪,如果增加的薪水大于300就取消加薪
declarecursorcrs_upadateSalisselect*fromempforupdateofsal;r_updateSalcrs_upadateSal%rowtype;salAddemp.sal%type;salInfoemp.sal%type;beginforr_updateSalincrs_upadateSalloopsalAdd:=r_updateSal.sal*0.2;ifsalAdd>300thensalInfo:=r_updateSal.sal;dbms_output.put_line(r_updateSal.ename||':加薪失败。'||'薪水维持在:'||r_updateSal.sal);elsesalInfo:=r_updateSal.sal+salAdd;dbms_output.put_line(r_updateSal.ENAME||':加薪成功.'||'薪水变为:'||salInfo);endif;updateempsetsal=salInfowherecurrentofcrs_upadateSal;endloop;end;
八. 使用case
when:按部门进行加薪
declarecursorcrs_caseTestisselect*fromempforupdateofsal;r_caseTestcrs_caseTest%rowtype;salInfoemp.sal%type;beginforr_caseTestincrs_caseTestloopcasewhenr_caseTest.deptno=10THENsalInfo:=r_caseTest.sal*1.05;whenr_caseTest.deptno=20THENsalInfo:=r_caseTest.sal*1.1;whenr_caseTest.deptno=30THENsalInfo:=r_caseTest.sal*1.15;whenr_caseTest.deptno=40THENsalInfo:=r_caseTest.sal*1.2;endcase;updateempsetsal=salInfowherecurrentofcrs_caseTest;endloop;end;
九. 异常处理:数据回滚
setserveroutputon;declared_namevarchar2(20);begind_name:='developer';savepointA;insertintoDEPTvalues(50,d_name,'beijing');savepointB;insertintoDEPTvalues(40,d_name,'shanghai');savepointC;exceptionwhenothersthendbms_output.put_line('errorhappens');rollbacktoA;commit;end;/
十. 基本指令:
setserveroutputonsize1000000formatwrapped;--使DBMS_OUTPUT有效,并设置成最大buffer,防止"吃掉"最前面的空格setlinesize256;--设置一行可以容纳的字符数setpagesize50;--设置一页有多少行数setarraysize5000;--设置来回数据显示量,这个值会影响autotrace时一致性读等数据setnewpagenone;--页和页之间不设任何间隔setlong5000;--LONG或CLOB显示的长度settrimspoolon;--将SPOOL输出中每行后面多余的空格去掉settimingon;--设置查询耗时colplan_plus_expformata120;--autotrace后explainplanoutput的格式settermoutoff;--在屏幕上暂不显示输出的内容,为下面的设置sql做准备altersessionsetnls_date_format='yyyy-mm-ddhh34:mi:ss';--设置时间格式
小知识:
下面的语句一定要在Command Window里面才能打印出内容
setserveroutputon;begindbms_output.put_line('hello!');end;/
看完上述内容,你们对oracle中存储过程如何使用有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。