Oracle基本PLSQL的使用实例详解
Oracle基本PLSQL的使用实例详解
PL/SQL块是在SQL语言之上发展起来的一种应用,可以集中的处理各种复杂的SQL操作。
组成:
DECLARE:声明部分 BEGIN 编写主题 EXCEPTION捕获异常 END;
1.一个简单的PL/SQL块
DECLARE inumber; BEGIN I:=30; DBMS_OUTPUT.put_line('I的内容为:'||i); END;
此时,直接执行程序即可。
执行之后发现没有任何的输出。因为Oracle在系统设置中默认设置了输出不显示,如果要显示的话,输入以下命令:
setserveroutputon;如果是使用Toad,则可以在Desktop中选择PLSQL,并打开DBMSOUTPUT。
带异常的语句块
DECLARE inumber; BEGIN i:=1/0; EXCEPTION whenZERO_DIVIDEthen DBMS_OUTPUT.put_line("ThereisaException"); END;
注意:输出字符串应该使用单引号''。
2.PL/SQL块还可以接收用户的输入信息,例如:现在要求用户输入一个雇员编号,之后根据输入的内容进行查询,查询雇员的姓名。
用户的输入信息使用“&”完成
DECLARE enonumber; envarchar(20); BEGIN --输入的信息保存在eno里 eno:=&no; --之后根据eno的值,对数据库进行查询操作。 selectenameintoenfromempwhereempno=eno; DBMS_OUTPUT.put_line('编号为:'||eno||'雇员的姓名为:'||en); EXCEPTION WHENno_data_foundTHEN DBMS_OUTPUT.put_line('没有此雇员'); END;
3.在以上的查询中再进一步:可以根据雇员的编号查出姓名及其领导的姓名和所在的部门,进行显示。
DECLARE enoemp.empno%TYPE; enemp.ename%TYPE; mnemp.ename%TYPE; dndept.dname%TYPE; deptdept%rowtype; BEGIN --输入的信息保存在eno里 eno:=&no; --之后根据eno的值,对数据库进行查询操作 SELECTe.ename,m.ename,d.dnameINTOen,mn,dn FROMempe,deptd,empm WHEREe.empno=7369ANDe.mgr=m.empnoANDe.deptno=d.deptno; DBMS_OUTPUT.put_line('编号为:'||eno||'雇员的姓名为:'||en); DBMS_OUTPUT.put_line('编号为:'||eno||'雇员的上级姓名为:'||mn); DBMS_OUTPUT.put_line('编号为:'||eno||'雇员所在的部门:'||dn); DBMS_OUTPUT.put_line(dept.deptno); EXCEPTION WHENno_data_foundTHEN DBMS_OUTPUT.put_line('没有此雇员'); END;
说明:
•no_data_found一种异常类型:没有发现数据
•emp.empno%TYPE;:表示以emp表中的empno字段的类型定义变量
•e.ename,m.ename,d.dnameINTOen,mn,dn:一次可以同时放进去多个值
deptdept%rowtype; 表示dept是一行数据
PL/SQL之中也包含了:循环、分支等条件控制语句
4.Loop循环(类似do…while)
格式:
LOOP 循环的语句; EXITWHEN终止条件; 循环条件必须更改;ENDLOOP;
例如:循环输出1~10。
DECLARE countNumNUMBER; BEGIN --必须赋初值 countNum:=1; LOOP DBMS_OUTPUT.put_line('countNum='||countNum); EXITWHENcountNum>10; countNum:=countNum+1; ENDLOOP; END;
注意:count关键字只能在sql语句中使用
此循环是先执行一次之后再进行判断,执行结果到11结束循环
5.while循环
格式:
WHILE(判断循环的条件) LOOP循环的语句; 循环条件的改变; ENDLOOP;
使用此语句修改上面的程序:
DECLARE countNumNUMBER; BEGIN --必须赋初值 countNum:=1; WHILE(countNum<10) LOOP DBMS_OUTPUT.put_line('countNum='||countNum); countNum:=countNum+1; ENDLOOP; END;
此语句,是先判断,如果满足条件则继续执行循环体,执行结果到9结束循环
6.for循环
格式: FOR变量名称in变量的初始值..结束值 LOOP 循环语句; ENDLOOP; 修改上例: DECLARE countNumNUMBER; BEGIN FORcountNumIN1..10 LOOP DBMS_OUTPUT.put_line('countNum='||countNum); ENDLOOP; END;
此语句countNum大于等于1小于等于10,最后输出1-10
7.if语句
条件判断
格式:
IF条件THEN 满足条件时,执行此语句 ENDIF;
例:
DECLARE countNumNUMBER; BEGIN countNum:=11; IFcountNum>10THEN DBMS_OUTPUT.put_line('countNum='||countNum); ENDIF; END;
条件语句,满足条件,执行一次
8.IF…ELSE语句
如果IF满足了,则执行,否则执行ELSE
例:
DECLARE countNumNUMBER; BEGIN countNum:=1; IFcountNum>10THEN DBMS_OUTPUT.put_line('countNum='||countNum); ELSE DBMS_OUTPUT.put_line('条件不不成立'); ENDIF; END;
条件不满足执行else后面的语句
9.if…elsif…else语句
例:
DECLARE countNumNUMBER; BEGIN countNum:=1; IFcountNum>10THEN DBMS_OUTPUT.put_line('countNum='||countNum); ELSIFcountNum<5THEN DBMS_OUTPUT.put_line('值小于5'); ELSE DBMS_OUTPUT.put_line('条件不满足'); ENDIF; END;
多重判断语句,满足条件执行对应的跳转
10.goto语句
无条件跳转语句
用于程序控制非条件跳至指定标签<??>>。不易控制和维护,慎用!
DECLARE enoemp.empno%TYPE; salemp.sal%TYPE; BEGIN eno:=&en; SELECTsalINTOsalFROMempWHEREempno=eno; IFsal>3500THEN gotopo1; ELSIFsal>2000THEN gotopo2; ELSE gotopo3; ENDIF; --标签 <>DBMS_OUTPUT.put_line('高工资。。。'); < >DBMS_OUTPUT.put_line('中等工资。。'); < >DBMS_OUTPUT.put_line('低工资。。。'); END;
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!