浅谈oracle中的视图和存储过程

1对于没有亲自试用过视图和存储过程的人来说,这两个东西就是看起来好像是怎样,但就是不知道是个什么,下面我综合我了解的浅谈

2.视图

a.其实视图就是一张表,一张拼起来的临时表,而且只能用来查询,不能来更新和删除,而且不占表空间的大小。

视图的作用:
第一点:使用视图,可以定制用户数据,聚焦特定的数据。

解释:
    在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话,
    采购人员,可以需要一些与其有关的数据,而与他无关的数据,对他没
    有任何意义,我们可以根据这一实际情况,专门为采购人员创建一个视
    图,以后他在查询数据时,只需select * from view_caigou 就
    可以啦。

第二点:使用视图,可以简化数据操作。

    解释:我们在使用查询时,在很多时候我们要使用聚合函数,同时还要
    显示其它字段的信息,可能还会需要关联到其它表,这时写的语句可能
    会很长,如果这个动作频繁发生的话,我们可以创建视图,这以后,我
    们只需要select * from view1就可以啦~,是不是很方便呀~

第三点:使用视图,基表中的数据就有了一定的安全性

  解释:
    因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以
    将基表中重要的字段信息,可以不通过视图给用户,视图是动态的数据的集
    合,数据是随着基表的更新而更新。同时,用户对视图,不可以随意的更改
    和删除,可以保证数据的安全性。

第四点:可以合并分离的数据,创建分区视图(//目前我没用到)

    解释:
    随着社会的发展,公司的业务量的不断的扩大,一个大公司,下属都设有很
    多的分公司,为了管理方便,我们需要统一表的结构,定期查看各公司业务
    情况,而分别看各个公司的数据很不方便,没有很好的可比性,如果将这些
    数据合并为一个表格里,就方便多啦,这时我们就可以使用union关键字,
    将各分公司的数据合并为一个视图。

2.上面的是我看到目前对视图使用总结很到位的。就不赘述了。下面我写个最简单的demo

视图的写法:
            CREATE VIEW view_name AS
            //后面的表的拼凑看具体业务需求
                select * from table where XXX

使用视图:   select * from view_name

3.存储过程
通俗的理解:你要进行某个报表的制作,(报表的数据肯定会随着时间的改变而改变),但是你获取数据的操作是不会变的,你可以现场查询,然后插入,在删除,再查询…就是一系列的过程,把这个过程提前写好编译,下次直接调用就很快速方便,这就是一个存储过程

简单的存储过程写法(基于oracle):(一定要注意end后面必须使用分号)
 create or replace procedure 存储过程名 (参数) 
    as
    定义变量(包含变量的大小)               
begin
    null;
end;
************************************
11)参数:
    p_id in varchar2(in 表示入参,大小由外来决定)
    p_name out varchar2(out 表示输出参数,在调用存储过程之前给它赋值,任然为空)
    p_add in out varchar2 (in out 表示参数既可以是入参,也可以是输出参数)
    p2 varchar2 default 'mark' (默认参数p2的默认值是mark)
    p1 in number (入参p1定义为整形)//如果不写in out 最后默认是in

22)定义变量 p_tel varchar2(50); //变量带取值范围,后面接分号 

33)涉及到到符号: 
    1):= 表示给变量赋值   p_name := 'aaaa';
    2)>= 给参数设定默认值 p_id >= '12';

4.存储过程一般配合游标使用(具体游标的使用可以自己去学习下)

**一般配合游标使用,游标相当于一个可以遍历的结果集**
例:create or replace procedure PS is
//定义一个游标c,里面存的是Id的集合
    cursor c is(
        select id as user_id//(DQL select语句 不需要提交事务)
            from (select id from t_sm_user_temp));

begin
     for c_row in c //for循环遍历c游标,赋值给c_row对象
         loop
    insert into t_sm_user_role
        (user_id, role_id)
            values
            //直接用c_row可以点出其中的属性user_id
        (c_row.user_id, 7450);
  end loop;
    commit;//插入,删除,更新后要提交事务(DML 操纵数据的语言,需要commit)
end;
**上面的存储过程我解释下,其实是个很简单的demo,首先从一张表里找一个user_id字段的结果集,然后插入到另一张表的user_id字段**

**重点**

//使用for循环来遍历游标可以自动的打开或者开闭,不用手动操纵。

4.在存储过程中用的较多的语句,select into,会产生两个异常

**使用select into语句会产生两个异常**  

a)使用游标可以处理掉(select into)语句找不到数据的异常(no_data_found)
    create or replace procedure procexception(p varchar2)   
        as    
     v_postype varchar2(20);   
      cursor c_postype is select pos_type 
         from pos_type_tbl where 1=0;   
    begin   
          open c_postype;   //打开游标
              fetch c_postype into v_postype;   
          close c_postype;   //关闭游标
          dbms_output.put_line(v_postype);   
    end;

b)使用select into 的第二个异常(too_many_rows)处理,数据太多
这个时候就必须手动处理异常了。
create or replace procedure procexception2(p varchar2)   
    as    
  v_postype varchar2(20);   

begin   
      begin   
        select pos_type into v_postype from pos_type_tbl where rownum < 5;   
         exception   
            when no_data_found then   
              v_postype :=null;   
                    when too_many_rows then   
                         raise_application_error
         end;   
            dbms_output.put_line(v_postype);   
    end;  

5.个人在项目中使用存储过程还是比较少的,一般会在做报表的时候才会使用(当然也会有其他的业务会使用到),使用后,由于预先编译了,所以比手动sql效率高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值