Oracle


程序包(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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值