oracle动态创建表带参数,演示从表中的行选择第N大/小...-oracle数据库表部分字段双向同...-在Oracle 里创建带参数的视图_169IT.COM...

需求:数据库里面有两张表,结构不完全相同,需要实时同步两张表的部分字段

实现方案:两张表上分别建立触发器进行同步,但是这样操作会有个问题,就会导致触发器循环触发。那么就需要在触发器进行触发前,进行一个判断,如果操作是由触发器引发的,那么就不做操作,反之,执行触发器定义的操作。想要实现这个,我开始考虑过在触发器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 完工

本文链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值