zoukankan      html  css  js  c++  java
  • oracle学习第五天

    视图


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

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

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


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

    创建视图
    create or replace view v_emp
    as
    select col1,col2 from emp;

    grant create view to scott;

    desc v_emp;

    删除视图
    drop view 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表中的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

    创建序列
    create sequence seq_user;
    使用序列
    查看下一个value
    select seq_user.nextval from dual;
    查看当前value
    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,'jack','123123',sysdate);

    删除序列
    drop sequence seq_user;


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

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

    create table t_product(
    id number,
    p_name varchar2(100) not null,
    p_salenum number default 0,
    p_stock number default 0,
    p_init_salenum number,
    constraint pk_product primary key(id)
    );

    create sequence seq_product; --创建序列的关键字和序列名称
    插入5条数据
    insert into t_product values(seq_product.nextval,'zy',100,200,50);
    insert into t_product values(seq_product.nextval,'zhangsan',300,600,100);
    insert into t_product values(seq_product.nextval,'lisi',500,1000,300);
    insert into t_product values(seq_product.nextval,'wangwu',1000,2000,500);
    insert into t_product values(seq_product.nextval,'mm',200,400,30);

    建立视图
    create or replace view v_product
    as
    select id no,p_name name,p_salenum salenum,p_stock stock from t_product;

    查询视图
    select * from v_product;

    从视图插入一条数据
    insert into v_product values(seq_product.nextval,'xiaoliu',100,200);
    -------------------------------------------------------------------------------
    存储过程
    存储过程适合做更新操作,特别是大数据量的更新

    创建存储过程
    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=3;
    commit;
    end;
    /

    create or replace procedure proc
    as
    begin
    insert into t_user values(seq_user.nextval,'zy',324234,sysdate);
    commit;
    end;


    调用存储过程
    exec proc1;
    exec proc;
    -------------------------------
    带输入参数的存储过程
    创建存储过程
    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('tom','121212');
    call proc2('mary');


    -------------------------------
    带输出参数的存储过程
    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);
    end;
    set serverout on;
    var pp varchar2(100);
    exec proc3('tom',:pp);
    -------------------------------
    带输出多个参数的存储过程
    create or replace procedure proc3(
    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);
    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,'suqier','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
    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
    as
    begin
    for i in 1..100 loop
    dbms_output.put_line(i);
    end loop;
    end;

    exec proc_for;
    ---------------------------------------
    create or replace procedure proc3(
    param1 in varchar2,param2 out varchar2,param3 out varchar2 --in代表输入参数 out 代表输出参数 param0 in out number
    )
    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('查询的结果数据是:id=' || param2 || ',password=' || param3);
    dbms_output.put_line(param);
    end;
    set serverout on;
    var pp1 varchar2(100);
    var pp2 varchar2(100);
    exec proc4('tom',:pp1,:pp2);

  • 相关阅读:
    直接初始化和复制初始化
    C++ 内连接与外连接 (转)
    mysql-Innodb事务隔离级别-repeatable read详解(转)
    Linux操作系统多线程信号总结
    Keil MDK 5.14 仿真时System Viewer菜单显示空白和Peripherals菜单无外设寄存器
    转载傅里叶级数和傅里叶变换的理解 https://www.cnblogs.com/h2zZhou/p/8405717.html
    SPI总线的原理与Verilog实现
    SD 模拟sip 读写子程序
    SD卡 模拟SPI总线控制流程
    SD卡spi读写流程
  • 原文地址:https://www.cnblogs.com/zy19930408/p/4872529.html
Copyright © 2011-2022 走看看