一、pl/sql进阶―控制结构
pl/sql中提供了三种条件分支语句 if -- then, if --then---else, if---then---elsif---else
(1)简单的条件判断 if ? then
问题:编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该员工工资增加10%。
Sql代码
1. create or replace procedure sp_pro6(spName varchar2) is
2. --定义
3. v_sal emp.sal%type;
4. begin
5. --执行
6. select sal into v_sal from emp where ename=spName;
7. --判断
8. if v_sal<2000 then
9. update emp set sal=sal+sal*10% where ename=spName;
10. end if;
11. end;
(2)二重条件分支 if―then--else
问题:编写一个过程,可以输入一个雇员名,如果该雇员的补助不是0就在原来的基础上增加100;如果补助为0就把补助设为200;
Sql代码
1. create or replace procedure sp_pro6(spName varchar2) is
2. --定义
3. v_comm emp.comm%type;
4. begin
5. --执行
6. select comm into v_comm from emp where ename=spName;
7. --判断
8. if v_comm<>0 then
9. update emp set comm=comm+100 where ename=spName;
10. else
11. update emp set comm=comm+200 where ename=spName;
12. end if;
13. end;
(3)多重条件分支 if--then--elsif--else
问题:编写一个过程,可以输入一个雇员编号,如果该雇员的职位是PRESIDENT就给他的工资增加1000,如果该雇员的职位是MANAGER就给他的工资增加500,其它职位的雇员工资增加200。
Sql代码
1. create or replace procedure sp_pro6(spNo number) is
2. --定义
3. v_job emp.job%type;
4. begin
5. --执行
6. select job into v_job from emp where empno=spNo;
7. if v_job='PRESIDENT' then
8. update emp set sal=sal+1000 where empno=spNo;
9. elsif v_job='MANAGER' then
10. update emp set sal=sal+500 where empno=spNo;
11. else
12. update emp set sal=sal+200 where empno=spNo;
13. end if;
14. end;
二、循环语句 ?while循环?
基本循环至少要执行循环体一次,而对于while循环来说,只有条件为true时,才会执行循环体语句,while循环以while...loop开始,以end loop结束。
问题:请编写一个过程,可以输入用户名,并循环添加10个用户到users表中,用户编号从11开始增加。
Sql代码
1. create or replace procedure sp_pro6(spName varchar2) is
2. --定义 :=表示赋值
3. v_num number:=11;
4. begin
5. while v_num<=20 loop
6. --执行
7. insert into users values(v_num,spName);
8. v_num:=v_num+1;
9. end loop;
10. end;
三、顺序控制语句-goto ,null
①goto语句
goto语句用于跳转到特定标号去执行语句.注意由于使用goto语句会增加程序的复杂性,并使得应用程序可以读性变差,所以在做一般应用开发时,建议大家不要使用goto语句.
基本语法如下 goto lable,其中lable是已经定义好的标号名.
declare
i int :=1;
begin
loop
dbms_output.put_line(‘输出i=‘||i);
if i=10 then
goto end_loop;
end if;
i:=i+1;
end loop;
<>
dbms_output.put_line('循环结束');
end;
注意:--in:表示这是一个输入参数,默认为in
--out:表示一个输出参数
四、oracle视图
创建视图
create view 视图名 as select语句 [with read only]
创建或修改视图
create or replace view 视图名 as select语句 [with read only]
删除视图
drop view 视图名
五、pl/sql进阶―例外处理
Exception
When <异常情况名>then
<异常处理代码>
When <异常情况名>then
<异常处理代码>
……
when others then
<异常处理代码>
例外情况名 错误代码 描述
NO_DATA_FOUND ORA-01403 对于SELECT 叙述没有传回任何值。
TOO_MANY_ROWS ORA-01427 只允许传回一笔记录的SELECT 叙述结果却多于一笔。
INVALID_CURSOR ORA-01001 使用非法的的光标操作。
VALUE_ERROR ORA-06502 出现数值、数据形态转换、撷取字符串或强制性的错误。
INVALID_NUMBER ORA-01722 字符串到数值的转换失败。
ZERO_DIVIDE ORA-01476 被零除。
DUP_VAL_ON_INDEX ORA-00001 试图向具有唯一键值的索引中插入一个重复键值。
CASE_NOT_FOUND ORA-xxxxx 没有case条件匹配
CURSOR_NOT_OPEN ORA-xxxxxx 游标没有打开
各种案例: 1.请写一个过程,可以向book表添加书,要求通过java程序调用该过程。 --编写过程 Sql代码 create or replace procedure sp_pro7(spBookId in number,spbookName in varchar2,sppublishHouse in varchar2) is begin insert into book values(spBookId,spbookName,sppublishHouse); end; --在java中调用
package com.oracle.demo;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
public class Procedure_07_Test {
public static void main(String[] args) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection co |