zoukankan      html  css  js  c++  java
  • Oracle数据库学习 视图、序列及存储过程

    视图(View)
    视图也被称作虚表,也就是虚拟的表,是一组数据的逻辑表示。
    视图对应一个select语句,结果集被赋予一个名字,也就是视图的名字。
    视图本身不包含任何数据,它只是包含映射到基表的一个查询语句,当基表数据发声变化,视图数据也随之变化。
    视图创建后,可以像操作表一样操作视图,主要是查询。

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

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

    对scott用户授权(在sysdba角色下)
    grant create view to scott;

    创建视图(用户必须有创建视图的权限)
    create or replace view v_emp
    as
    select ename,sal from emp;

    查看视图结构
    desc v_emp;

    删除视图
    drop view v_emp;

    查询视图中的数据:
    select * from v_emp;

    --------------------------------------------------------------------------------------------
    序列(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
    cycle
    -- cache num|nocache --缓存区大小 默认20
    cache 3

    使用序列
    select seq_user.nextval from dual;

    select seq_user.currval from dual;

    删除序列
    drop sequence seq_user;

    建表
    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,'Owen','123123',sysdate);


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

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

    创建表
    create table t_product(
    p_no number,
    p_name varchar2(100) not null,
    p_sal_num number default 0,
    p_has_num number default 0,
    p_sal_num_start number,
    constraint pk_product primary key(p_no)
    );

    创建序列
    create sequence seq_product --创建序列的关键字和序列名称

    插入5条数据
    insert into t_product values(seq_product.nextval,'苹果5s',128,200,110);
    insert into t_product values(seq_product.nextval,'苹果6',88,150,0);
    insert into t_product values(seq_product.nextval,'苹果6s',98,100,50);
    insert into t_product values(seq_product.nextval,'苹果6plus',128,200,110);
    insert into t_product values(seq_product.nextval,'苹果7',99,0,99);

    建立视图(不显示产品初始化销量)
    create or replace view v_product
    as
    select p_no,p_name,p_sal_num,p_has_num from t_product;

    查询视图
    select * from v_product;

    从视图插入一条数据
    insert into v_product values(seq_product.nextval,'苹果8',0,0);

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

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

    创建存储过程
    create or replace procedure proc1
    as|is 相当于 declare 声明的意思
    abc varchar2(100); --定义该存储过程的变量,作用域就是本存储过程中
    begin
    update t_user set username='老王' where id=3;
    commit;
    end;
    /


    例如:
    create or replace procedure proc1
    as
    begin
    update t_user set username='老王' where id=3;
    commit;
    end;
    /
    调用存储过程
    exec proc1;
    ----------------------------------------------------------------------------------------------
    带输入参数的存储过程
    创建存储过程
    create or replace procedure proc2(
    param1 varchar2,param2 varchar2 --存储过程的参数 类型不需要指定宽度(范围)
    )
    as
    begin
    insert into t_user values(seq_user.nextval,param1,param2,sysdate);
    commit;
    end;
    /

    执行
    exec proc2('Owen','121212');
    call proc2('Haha','111111'); --在dos窗口下可以

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

    带输出参数的存储过程
    create or replace procedure proc3(
    param1 in varchar2,param2 out varchar2 --in代表输入参数,out代表输出参数,param0 in out number
    )
    as
    begin
    select password into param2 from t_user where username=param1;
    dbms_output.put_line(param2);
    commit;
    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代表输出参数,param0 in out number
    )
    as
    begin --注意:这里只能处理返回的是一条记录结果集,如果结果集含有多条记录,oracle没有提供直接处理的方式,
    --必须间接的接触游标,游标本身的效率很差,所以实际开发中基本上不使用
    select id,password into param2,param3 from t_user where username=param1;
    dbms_output.put_line('查询的结果数据是:id='||param2||'password='||param3);
    commit;
    end;
    /

    执行
    set serverout on;
    var pp1 varchar2(100);
    var pp2 varchar2(100);
    exec proc4('tom',:pp1,:pp2);
    ---------------------------------------------------------------------
    定义变量
    param1 varchar2(100); --变量的类型可以是oracle系统的所有合法的数据类型
    param2 number;

    给变量赋值
    param1 :='who am i!';
    param2 :=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;
    /

    exec proc_if(5);

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

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


    create or replace procedure proc_while
    as
    i number;
    begin
    i:=1;
    while i<100 loop
    dbms_output.put_line(i);
    i:=i+1;
    end loop;
    end;
    /

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


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

    exec proc_for(6);

  • 相关阅读:
    影响一个UIView是否能正常显示的几个因素
    浅谈多进程多线程的选择
    Spring阅读方法
    数据库范式通俗解释
    MySQL学习笔记(二):MySQL数据类型汇总及选择参考
    MySQL学习笔记(一):SQL基础
    存储过程优缺点
    MySQL学习笔记(三):常用函数
    bzoj 3576[Hnoi2014]江南乐 sg函数+分块预处理
    bzoj 3166 [Heoi2013]Alo 可持久化Trie
  • 原文地址:https://www.cnblogs.com/xujianbo/p/4921692.html
Copyright © 2011-2022 走看看