Oracle数据库基础(四)--视图,序列,存储过程

视图

什么是视图?
视图(view)也被称作虚表,也就是虚拟的表,是一组数据的逻辑表示.
视图对应一个select语句,结果集被赋予一个名字,就是视图的名字.
视图本身不包含任何数据,他只是包含映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之发变化.

视图创建后,可以像操作表一样操作视图,主要是查询.
根据视图所对应的子查询种类分为几种类型:
select语句是基于单表建立,并且不包含任何函数运算,表达式或者分组函数,叫做简单视图,此时视图是基表的子集.
select语句是基于单表建立,但是包含了单行函数,表达式,分组函数后者group by子句,叫做复杂视图.
select语句是基于多个表的,叫做连接视图.

视图的作用
1--如果需要经常执行某种复杂查询,可以基于这个复杂查询建立视图,以后查询此视图即可,可以简化复杂查询
2--视图本质上是一条select语句,所以当访问视图时,只能访问到对应的select语句中涉及到的列,
   对基表中的其他列起到安全和保密的作用,限制数据的访问

创建视图的用户必须要获得创建视图的权限
在sysdb角色下为指定用户权限
conn sys/s as sysdba;
show user;
grant create view to scott;
conn scott/a;
show user;


create or replace view v_emp 
as 
select empno,ename,sal from emp; 

desc v_emp;

drop view v_emp;

select * from v_emp;

create or replace view v_emp_2
as
select empno no,ename name,job job,sal sal from emp;
创建视图时使用别名,查询视图时也要使用别名

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

序列(sequence)

用在哪里?
在mysql数据库中,可以设置id字段以自动增长的方式,实现数据的插入
create table mysql_tbl(
 id int primary key auto_increment,
 name varchar(100)
)

在oracle数据库中,如何实现mysql表中的字段自动增长
使用序列,序列是oracle中的一种对象
create sequence seq_user ;    --创建序列的关键字和序列名称
increment by 1               --自动增加的步长  (默认1)
start with 1                 --开始的大小值    (默认1)
maxvalue | minvalue num      --最大值和最小值  (默认 nomaxvalue 10的26次方)
nomaxvalue                   --默认的 不限制
cycle | nocycle              --是否轮回        (默认 nocycle)
cache num| nocache           --缓存区大小      (默认 20)

使用序列
select seq_user.nextval from dual;


select seq_user.currval from dual;


建表
create table t_user(
   id number,
   username varchar2(100),
   password varchar2(48),
   regtime  date,
   constraint pk_user primary key(id)   
);

insert into t_user values(seq_user.nextval,'sun','123123',sysdate);

删除序列
drop sequence seq_user;


需要一张表t_product
编号 主键 自动增长
产品名称 非空
产品销量 非空 默认为零
产品库存 非空 默认为0
产品初始化销量


创建表
create table t_product(
   id number,
   p_name varchar2(100) not null,
   p_sales number default 0 not null,
   p_sum   number default 0 not null,
   p_start_sum number,
   constraint pk_product primary key(id) 
);


create sequence seq_id;
插入五条数据
insert into t_product values(seq_id.nextval,'tudou',100,1000,50);
建立视图(视图中不显示 产品初始化销量)
create or replace view v_product
as
select id,p_name,p_sales,p_sum from t_product;
查询视图
select * from v_product;
从视图插入一条数据
insert into v_product values(seq_id.nextval,'maodou',500,2500);


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


存储过程
存储过程适合更新操作,特别是大数据量的更新


创建存储过程
create or replace procedure proc1
as|is                    --相当于declare 声明的意思
  abc varchar2(100);     --定义该存储过程的变量,作用域就是本储存过程中
begin
  update t_user set username='lucy' where id=3; 
end;
/
-----------------------------------
例如 修改
create or replace procedure proc1
as                  
begin
  update t_user set username='lucy' where id=4; 
  commit;
end;
/
------------------------------------
添加
create or replace procedure proc1
as
begin
  insert into t_user values(seq_user.nextval,'tom','111222',sysdate);
  commit;
end;



调用存储过程
exec proc1;


--------------------------------------
带输入参数的存储过程
创建
create or replace procedure proc2(
   param1 varchar2,param2 varchar2 default '888888'  --存储过程的参数  类型不需要指定宽度(范围)
)
as
begin
   insert into t_user values(seq_user.nextval,param1,param2,sysdate);
   commit;
end;
/


执行
exec proc2('ganjun');
call proc2('mary');


----------------------------------------
带输出参数的存储过程
create or  replace procedure proc3(
   param1 in varchar2,param2 out varchar2   --in 代表输入参数, out代表输出参数
  ) 
as
begin
  select password into param2 from t_user where username=param1;
  dbms_output.put_line(param2);
end;
/


set serverout on;
var pp varchar2(100);
exec proc3('tom',:pp);


-----------------------------------------
查询结果返回多个字段值的存储过程


create or  replace procedure proc4(
   param1 in varchar2,param2 out varchar2,param3 out varchar2   --in 代表输入参数, out代表输出参数
  ) 
as
begin    --注意:这里只能处理返回的是一条记录的结果集,如果结果集含有多条记录,oracle没有提供直接处理的方式,
                必须间接借助游标,但是游标本身的效率很差,所以,实际开发中基本不适用
  select id,password into param2,param3 from t_user where username=param1;
  dbms_output.put_line(param2||param3);
end;
/


set serverout on;
var pp varchar2(100);
var pp1 varchar2(100);
exec proc4('tom',:pp,:pp1);


-------------------------------------------------
定义变量
   param1 varchar2(100);      --变量的类型 可以是oracle系统所有合法的数据类型
   param2 number;
  
给变量赋值
   param1:='who am i!';
   param2:=123;
------------------------------
带变量的存储
 create or  replace procedure proc5(
   param1 in varchar2,param2 out varchar2,param3 out varchar2   --in 代表输入参数, out代表输出参数
  ) 
as
  param varchar2(100);
begin   
  select id,password into param2,param3 from t_user where username=param1;
  param:='who am i?';
  dbms_output.put_line(param2||param3);
  dbms_output.put_line(param);
end;
/


set serverout on;
var pp varchar2(100);
var pp1 varchar2(100);
exec proc5('tom',:pp,:pp1); 
  
-------------------------------------------------
if 判断
 if t_value=1 then
   begin 
     do ...
   end;
 end if;
 ----------------------
 create or replace procedure proc_if(pp in number)
 as
    total number;
 begin
    total:=pp;
    if total<5 then
 begin
   insert into t_user values(seq_user.nextval,'苏乞儿','666666',sysdate);
commit;
 end;
end if;
 end;
 /
 
 
 call proc_if(3);


--------------------------------------------------
while循环
 while t_value=1 loop
  begin
      do.....
  end;
 end loop; 


--------------------------
create or replace procedure proc_while(pp in number)
as
   total number;
begin
   total:=pp;
   while total<10 loop
    begin
 total:=total+1;
 dbms_output.put_line(total||'我是谁?');  
end;
    end loop;
  end;
/


create or replace procedure proc_while(x in number)          for ( int i = 0;       ---- total number; total:=0;  
as                                                                 i < x;           ---- while total<x
   total number;                                                   i++)             ----- total:=total+1;
begin                                                        {system.out.println()} -----dbms_output.put_line(total||'我是谁?');
   total:=0;
   while total<x loop
    begin
 total:=total+1;
 dbms_output.put_line(total||'我是谁?');  
end;
    end loop;
  end;
/


set serverout on;
call proc_while(10);


 
---------------------------------------------------
for y in 1..100 loop
    i:=x*y;
exit when i=300;
end loop inner_zzl;


create or replace procedure proc_for(x in number)
as 
  i number;
begin
  for y in 1..100 loop
  i:=x*y;
  exit when i=300;
  dbms_output.put_line(i);
  end loop;
end;
/


set serverout on;

call proc_for(3);



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值