oracle05--视图、序列、存储过程

视图

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

视图创建后可以向操作表一样的操作数据库,主要是查询。

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

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

在创建视图的用户必须要获得创建视图的角色
在sysdba角色下为指定用户授权
conn sys/11111 as sysdba;
show user;
grant create view to scott;
conn scott/11111;
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_emp2
as
select empno no,ename name,job job,sal sal from emp;

SQL> select no,name from v_emp2 where no=7369;

        NO NAME
---------- --------------------
      7369 SMITH

SQL> select no,name from v_emp2 where empno=7369;
select no,name from v_emp2 where empno=7369
                                 *
第 1 行出现错误:
ORA-00904: "EMPNO": 标识符无效

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

在oracle中如何实现mysql表中的id字段自动增长。
使用序列    序列是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) , passowrd varchar2(48) , regtime date , constraint pk_user primary key(id));

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

drop sequence seq_user;

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

创建表
插入5条数据
建立视图 (视图中不显示产品初始化销量)
查询视图
从视图插入一条数据

create sequence seq_product;

create table t_product (
    p_id number ,
    p_name varchar2(100)  not null,
    p_sales_num number default 0 not null ,
    p_has_sum number default 0 not null ,
    p_init_sales number ,
    constraint pk_product_id primary key(p_id)
);

insert into t_product values (seq_product.nextval , '怡宝' , 800 , 1000 , 100);

create or replace view v_product
as
select p_id , p_name , p_sales_num , p_has_sum from t_product;

select * from v_product;

insert into v_product values (seq_product.nextval , '怡宝' , 800 , 1000);

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

创建存储过程
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 = 'hello' where id = 2 ;
    commit ;
end ;

调用存储过程
exec proc1 ;
call proc1 ;

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

调用存储过程
exec proc2('tom');
call proc2('tom');

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

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

----------------------------------------------------
查询结果返回多个字段的值的存储过程
create or replace procedure proc4(
    parama1 in varchar2 , parama2 out varchar2, parama3 out varchar2    --in 代表输入参数    out代表输出参数    parama0 in out number ,
)
as
    parama varchar2(100) ;
begin    --注意:这里只能处理返回的是一条记录的结果集
            --如果结果集含有多条记录,oracle没有提供直接处理的方式,必须间接的借助游标,但是游标本身的效率很差,实际开发中基本不适用
    select id, passowrd into parama2 , parama3 from t_user where username = parama1 ;
    parama := 'who am I ?' ;
    dbms_output.put_line('查询的结果数据是:id='||parama2||', password='||parama3) ;
    dbms_output.put_line(parama) ;
end ;

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

------------------------------------------------------------------------
定义变量
parama1 varchar2(100) ;    --变量的 类型可以是oracle系统所有合法的数据类型
parama2 number ;
给变量赋值
parama1 := 'who am i ?' ;
parama2 := 123 ;

判断
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 > 4 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 > 4 loop
        begin
            insert into t_user values (seq_user.nextval , '梅长苏') ;
            commit ;
            total := total - 1;
        end ;
    end loop ;
end ;

call proc_while(5);
------------------------------------------------------------------------
for y in 1..100 loop    
    i := x*y ;
    exit when i = 300;
end loop ;

 create or replace procedure proc_for
 as
 begin
    for i in 1..10 loop
        dbms_output.put_line(i) ;
    end loop;
 end ;

posted @ 2015-10-18 08:57  Tsoi  阅读(95)  评论(0)    收藏  举报