当前位置:  数据库>oracle
本页文章导读:
    ▪演示从表中的行选择第N大/小的值      本文内容 软件环境 Oracle SCOTT 用户 从表选择第N大的值 从表选择第N小的值   软件环境 Windows Server 2008 R2 Oracle 11g Release 1 (11.1)   Oracle SCOTT 用户 本文使用 SCOTT 用.........
    ▪oracle数据库表部分字段双向同步,利用包和触发器实现      需求:数据库里面有两张表,结构不完全相同,需要实时同步两张表的部分字段实现方案:两张表上分别建立触发器进行同步,但是这样操作会有个问题,就会导致触发器循环触发。那么就需.........
    ▪在Oracle 里创建带参数的视图      在Oracle里,视图不像存储过程和函数一样,可以定义输入参数,但我们可以变个方式,使用程序包来实现首先定义程序包:/* 按个人需要定义,我定义三个参数 ,因我项目程序需要,所以三.........

[1]演示从表中的行选择第N大/小的值
    来源:    发布时间: 2013-10-29
本文内容
  • 软件环境
  • Oracle SCOTT 用户
  • 从表选择第N大的值
  • 从表选择第N小的值

 

软件环境
  • Windows Server 2008 R2
  • Oracle 11g Release 1 (11.1)

 

Oracle SCOTT 用户

本文使用 SCOTT 用户的 EMP 表。内容如下:

SQL> select empno,ename,sal



  2  from emp



  3  order by sal desc;



 



     EMPNO ENAME             SAL



---------- ---------- ----------



      7839 KING             5000



      7902 FORD             3000



      7788 SCOTT            3000



      7566 JONES            2975



      7698 BLAKE            2850



      7782 CLARK            2450



      7499 ALLEN            1600



      7844 TURNER           1500



      7934 MILLER           1300



      7521 WARD             1250



      7654 MARTIN           1250



 



     EMPNO ENAME             SAL




    
[2]oracle数据库表部分字段双向同步,利用包和触发器实现
    来源:    发布时间: 2013-10-29

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


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

本文链接


    
最新技术文章:
 




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3