-
PL/SQL块分类
1.匿名块
declare
v_avgsal number(6,2);
begin
select avg(sal) into v_avgsal from emp
where deptno=&no;
dbms_output.put_line('平均工资:'||v_avgsal);
end;
2.命名块
<<outer>>
declare
v_deptno number(2);
v_dname varchar2(10);
begin
<<inner>>
begin
select deptno into v_deptno from emp
where lower(ename)=lower('&name');
end;--<<inner>>
select dname into v_dname from dept
where deptno=v_deptno;
dbms_output.put_line('部门名:'||v_dname);
end;--<<outer>>
3.子程序(子程序包括过程、函数和包)
(1)过程
过程用于执行特定操作。当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out)。
create procedure update_sal(newname varchar2,newsal number)
is
begin
update emp set sal=newsal
where lower(ename)=lower(newname);
end;
调用该过程时,可以使用execute命令或call命令。示例如下:
execute update_sal('scott',2000)
call update_sal('scott',2000)
(2)函数
函数用于返回特定数据。当建立函数时,在函数头部必须包含 return 子句,而在函数体内必须包含 return 语句的返回数据。
create function annual_income(newname varchar2)
return number is
annual_salary number(7,2);
begin
select sal*12+nvl(comm,0) into annual_salary
from emp where lower(ename)=lower(newname);
return annual_salary;
end;
调用
var income number
call annual_income('scott') into :income
print income
(3)包
包用于逻辑组合相关的过程和函数,它由包规范和包体两部分组成。包规范用于定义公用的常量、变量、过程和函数。
create package emp_pkg is
procedure update_sal(newname varchar2,newsal number);
function annual_income(newname varchar2);
end;
create package body emp_pkg is
procedure update_sal(newname varchar2,newsal number)
is
begin
update emp set sal=newsal
where lower(ename)=lower(newname);
end;
function annual_income(newname varchar2)
return number is
annual_salary number(7,2);
begin
select sal*12+nvl(comm,0) into annual_salary
from emp where lower(ename)=lower(newname);
return annual_salary;
end;
end;
当调用包的过程和函数时(包名.子程序名)
execute emp_pkg.update_sal('scott',2000)
4.触发器
触发器是隐含执行的存储过程。当定义触发器时,必须要指定触发器事件以及触发操作,常用的触发事件包括 insert,update 和 delete 语句,而触发操作实际是一个PL/SQL块。
create trigger update_cascade
after update of deptno on dept
for each row
begin
update emp set deptno=:new.deptno
where deptno=:old.deptno;
end;