??
1.上节回顾
2.PL/SQL的进阶
3.oracle的视图
4.oracle的触发器
目标:
1.掌握PL/SQL的高级用法(能编写分页过程模块,下订单过程模块。。。)
2.会处理oracle常见的例外
3.会编写oracle各种触发器
4.理解视图的概念并能灵活使用视图
任何计算机语言都有各种控制语句,在PL/SQL中也存在这样的控制结构
在本部分学习完毕后,希望大家达到:
1)使用各种if
2)使用循环结构
3)使用控制语句 goto 和 null;
条件分支语句:
if then end if
if then else end if
if then elsif else end if
简单的条件判断:
案例:编写一个过程,可以输入一个雇员名,如果该雇员的工资低于
2000,就给该雇员工资增加10%
create or replace procedure sp_pro6(spName varchar2) is
--定义
v_sal emp.sal%type;
begin
--执行
select sal into v_sal from emp where ename=spName;
--判断
if v_sal < 2000 then
update emp set sal=sal+sal*10 where ename = spName;
end if;
end;
/
调用:
exec sp_pro6('scott');
二重条件分支:if - then - else
编写一个过程,可以输入一个雇员名,如果该雇员的补助不是0,则工资添加100
create or replace procedure sp_pro6(spName varchar2) is
--定义
v_comm emp.comm%type;
begin
--执行
select comm into v_comm from emp where ename=spName;
--判断
if v_comm <> 0 then
update emp set comm=comm+100 where ename = spName;
else
update emp set comm=comm+200 where ename = spName;
end if;
end;
/
--编写过程,给不同职位的员工添加不同的工资
create or replace procedure sp_pro6(spNo number) is
v_job emp.job%type;
begin
select job into v_job from emp where empno=spNo;
if v_job = 'PRESIDENT' then
update ...
elsif
update ...
else
update ...
end if;
end;
循环语句 -loop
PL/SQL中的循环语句,最简单的循环语句是loop语句
--编写过程,可以输入用户名,并循环添加10个用户到user表中,
用户编号从1开始增加
create or replace procedure sp_pro6(spName varchar2) is
v_num number := 1;
begin
loop
insert into users values(v_num,spName);
--判断是否要退出循环
exit then v_num=10; --等于10就要退出循环
--自增
v_num := v_num+1;
end loop;
end;
exec sp_pro6('你好');
循环语句:while循环
--编写过程,可输入用户名,并循环添加10个用户到users表中,
用户编号从11开始增加
while v_num <= 20 loop
insert into user values(v_num,spName);
v_num:=v_num+1;
end loop;
end;
循环语句:for循环
基本for循环的基本结构如下:
begin
for i in reverse 1 .. 10 loop
insert into user values(i,'世阳')
end loop;
end;
goto语句和null语句
goto end_loop;
<>
goto案例:
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;
end;
/
if
...
else
null;--表示什么都不做
分页过程:
无返回值的存储过程
create table book(bookId number,bookName varchar2(50),publishHouse varchar2(50));
--编写过程:
--in代表这是一个输入参数,默认为in
--out:表示一个输出参数
create or replace sp_pro7(spBookId in number,spbookName in varchar2,sppublishHouse in varchar2) is
begin
insert into book values(spBookId,spbookName,sppublishHouse);
end;
编写java程序调用无返回值的过程
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection ct=DriverManager.getConnection("jdbc:oracle:hin@127.0.0.1:1521","scott","tiger");
//2.创建CallableStatement
CallableStatement cs = ct.prepareCall("{call sp_pro7(?,?,?)}");
//给?赋值
cs.setInt(1,10);
cs.setString(2,"笑傲江湖");
cs.setString(3,"人民出版社");
//执行
cs.execute();
编写有返回值的存储过程(非列表)
create or replace procedure sp_pro8
(spno in number,spName out varchar2,spSal out number,spJob out varchar2)is
begin
select ename, sal, job into spName, spSal, spJob from emp where empno=spno;
end;
java如何获取有返回的存储过程的数据
//
callableStatement cs = ct.prepareCall("{call sp_pro8(?,?,?,?)}");
//给第一个?赋值
cs.setInt(1,7788);
//给第二个?赋值
cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);
cs.registerOutParameter(3,oracle.jdbc.OracleTypes.DOUBLE);
cs.registerOutParameter(4,oracle.jdbc.OracleTypes.VARCHAR);
//执行
cs.execute();
//区返回值要注意?的顺序
string name=cs.getString(2);
double sal =cs.getDouble(3);
string job=cs.getString(4);
编写一个过程,输入部门号,返回该部门所有雇员信息。此时用一般的参数是不可以的,需要使用package了,所以要分为两部分
(