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效率高。