程序包(package/package body)和子程序
程序包:没有begin
子程序:{
1.函数 function
2.存储过程 procedure
}
声明程序包
create or replace package pac_test
is
function f_test(eno number)return varchar2;
procedure p_test(eno number);
end pac_test;
实现程序包 (编写包体package body) (类似于实现接口)
注意:程序包不用create子程序,程序包名要相同,参数名参数类型也要相同。
create or replace package body pac_test
is
function f_test()return varchar2
is
sname varchar2(20);
begin
select ename into sname from emp where empno=eno;
return sname;
end f_test;
procedure p_test(eno in number,eename out varchar2)
is
begin
select ename into eename from emp where empno=eno;
end p_test;
end;
调用
--用法:包名.子程序
①
select pac_test1.f_test1(7999) from dual;
②
declare
eename varchar2(20);
begin
pac_test1.p_test(7999,eename);
dbms_output.put_line(eename);
end;
注意事项 |
---|
1.在创建时,先有程序包,再有子程序,要一步步执行。 |
2.包体名称要与程序包名字一致。 |
3.子程序要与程序包里的一致,参数名也要一致。 |
4.子程序位置可以不固定 |
触发器trigger
在执行数据库的增删改操作的时候触发某一些预定的行为。
触发器 | |
---|---|
两张临时表 | :old 旧表 / :new 新表 |
两个时间点 | before执行之前 / after执行之后 |
三种操作 | insert / update / delete |
触发器类型 | ①语句级触发器(行级)②表级触发器(整张表的触发器·) |
例:
行级
create or replace trigger tri_test
after
insert or update or delete on emp
for each row --行级
begin
case when deleting then --deleting /updating /inserting 正在进行时
if :old.ename='LEO' then
raise_application_error(-20000,'不能被删除');
--自定义系统错误20000-20999 '-'是符号不是负数
end if;
when updating then
when inserting then
end case;
end;
触发器声明变量
create or replace trigger tri_test
after
declare --!!!
sname varchar2(20); --!!!
insert or update or delete on emp
for each row --行级
begin
case when deleting then --deleting /updating /inserting 正在进行时
if :old.ename='LEO' then
raise_application_error(-20000,'不能被删除');
--自定义系统错误20000-20999 '-'是符号不是负数
end if;
when updating then
when inserting then
end case;
end;
–使用触发器实现主键自动增长
create or replace trigger tri_insertuser
before insert on users
for each row
begin
①:new.id=seq_test_id.nextval; --10版本不能用
②select seq_test_id.nextval into :new.id from dual; --10版本可用
end;
表级(不推荐)
create or replace trigger tri_tab
after delete on emp
begin
dbms_output.put_line('不能删!');
end;