需求:数据库里面有两张表,结构不完全相同,需要实时同步两张表的部分字段
实现方案:两张表上分别建立触发器进行同步,但是这样操作会有个问题,就会导致触发器循环触发。那么就需要在触发器进行触发前,进行一个判断,如果操作是由触发器引发的,那么就不做操作,反之,执行触发器定义的操作。想要实现这个,我开始考虑过在触发器a里面暂时使触发器b失效,但是发现alter trigger disable不合法;然后看到有人提到在表里面新增一个字段,用来做标识,但是这样需要修改表结构,虽然可以达到要求,但是总觉得不是很好,所以也没有使用;后来通过学习oracle对象,了解到了包的特性,所以决定采用包的方式来实现,利用包的变量来做标识。
/*操作过程中,需要分别执行‘包’,‘函数’,‘触发器’;一次性执行会有问题
操作完成后,注意检查‘包’,‘函数’,‘触发器’状态是否有效*/
--创建包头
create or replace package pk_check_active is
--标识是否为触发器引发
n number :=0;
--获取是否我触发器触发标识,1为触发器触发
function getactive return number;
--设置状态
procedure setactive(n1 in number);
end pk_check_active;
/*这里的/一定不能缺少*/
/
create or replace package body pk_check_active as
function getactive return number is
begin
return n;
end getactive;
procedure setactive(n1 in number) is
begin
n := n1;
end setactive;
end pk_check_active;
--获取guid的方式,采用了8-4-4-4-12的格式
create or replace function Creategs_oid return varchar2
is
guid varchar(64);
result varchar(64);
begin
guid := sys_guid();
result := substr(guid,1,8)||'-'||substr(guid,9,4)||'-'||
substr(guid,13,4)||'-'||substr(guid,17,4)||'-'||substr(guid,21,12);
return (result);
end Creategs_oid;
--触发表tableA
create or replace trigger tr_cs_user after insert or update or delete
on tableA for each row
begin
if pk_check_active.getactive() =1 then
pk_check_active.setactive(2); return;
else
pk_check_active.setactive(1);
end if;
if inserting then
insert into tableB (gs_oid,s_username,s_password) values (Creategs_oid(),:new.name,:new.pass);
elsif updating then
update taableB t set t.s_username=:new.name ,t.s_password=:new.pass where t.s_username=:old.name;
elsif deleting then
delete from tableB t where t.s_username = :old.name;
end if;
pk_check_active.setactive(0);
end;
--获取指定列最大值+1(也是一种id的标识方法,开始没有做成自增字段,所以写触发器的时候需要自己来实现了)
create or replace function GetCSUserID return number
is
result number;
[3]在Oracle 里创建带参数的视图
来源: 发布时间: 2013-10-29
在Oracle里,视图不像存储过程和函数一样,可以定义输入参数,但我们可以变个方式,使用程序包来实现
首先定义程序包:
/* 按个人需要定义,我定义三个参数 ,因我项目程序需要,所以三个参数都是number ,当然可定义其它类型
但切记,第二个create 的参数类型等需以第一个create一致,否则程序包创建失败
*/
create or replace package p_view_param is
--参数一
function set_param(num number) return number;
function get_param return number;
--参数二
function set_Type(num number) return number;
function get_Type return number;
--参数三
function set_Id(num number) return number;
function get_Id return number;
end p_view_param;
--
create or replace package body p_view_param is
paramValue number;
paramType number;
paramId number;
-- Param
function set_param(num number) return number is
begin
paramValue:=num;
return num;
end;
function get_param return number is
begin
return paramValue;
end;
-- Type
function set_Type(num number) return number is
begin
paramType:=num;
return num;
end;
function get_Type return number is
begin
return paramType;
end;
-- ID
function set_Id(num number) return number is
begin
paramId:=num;
return num;
end;
function get_Id return number is
begin
return paramId;
end;
end p_view_param;
创建的时候记得先创建第一个;
接下来定义视图:
/*
*定义视图,where 后面跟参数,可自己拼装,注意视图字段要和select的字段匹配
*/
CREATE OR REPLACE VIEW abstract_sum_view(fa_id, aircraft_num,aircraft_weight,airline_code,anchor_pos)
AS SELECT f.fa_id, f.aircraft_num,findweight(f.aircraft_num),f.airline_code,f.anchor_pos
FROM tb_flight_abstract f
where f.fa_id=p_view_param.get_Id(); --参数
--使用视图,传参
select * from abstract_sum_view where p_view_param.set_id(3)=3 ;
OK 完工
本文链接