zoukankan      html  css  js  c++  java
  • 老师oracle讲义第五天

    视图

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

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

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


    创建视图的用户必须要获得创建视图的权限
    在sysdba角色下为指定用户授权
    conn sys/a 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 ;

    SQL> select * from v_emp_2 where no = 7499;

    NO NAME JOB SAL
    ---------- -------------------- ------------------ ----------
    7499 ALLEN SALESMAN 1600


    SQL> select * from v_emp_2 where empno = 7499;
    select * from v_emp_2 where empno = 7499
    *
    第 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) , 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 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 ;

    调用存储过程
    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('tom');
    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 proc4(
    param1 in varchar2 , param2 out varchar2 , param3 out varchar2 --in 代表输入参数 out代表输出参数 param0 in out number
    )
    as
    param varchar2(100) ;
    begin --注意:这里只能处理返回的是一条记录的结果集 如果结果集含有多条记录,oracle没有提供直接处理的方式,
    --必须间接的借助游标,但是游标本身的效率很差,所以,实际开发中基本不适用
    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) ;

    ---------------------------------
    定义变量
    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 ;

    call proc_if(3);


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

    i :=1;
    while i<=5 loop
    insert into tb_zhaozhenlong(rpt_date ,dept_id,item,qty) values(to_date('2007-01-02','yyyy-MM-dd'),'D'||i,'I'||i,round(i*200/3,3));
    i :=i+1;
    end loop;


    CREATE OR REPLACE PROCEDURE TEST
    is
    i int := 1;
    BEGIN
    while i < 100 LOOP
    DBMS_OUTPUT.put_line(i);
    i:=i+1;
    end LOOP;
    END TEST;
    注:这里的i需要申明,并且循环体中,要对i进行改变


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

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

    -----------------
    CREATE OR REPLACE PROCEDURE TEST
    is
    BEGIN
    for i in 1..100 LOOP
    DBMS_OUTPUT.put_line(i);
    end LOOP;
    END TEST;
    注:这里的i可以不用申明,并且在循环体中,i会自增

  • 相关阅读:
    DOM优化
    jQuery绑定以及解除时间方法总结,以及事件触发的方法
    javascript的异步编程方法
    innerHTML,innertext ,textcontent,write()
    关于盒子的那些事
    关于HTTP的几种
    关于php中正则匹配包括换行符在内的任意字符的问题总结
    CSS透明属性详解
    Linux下apache日志分析与状态查看方法
    折半排序 (稳定的排序)
  • 原文地址:https://www.cnblogs.com/zy19930408/p/4872532.html
Copyright © 2011-2022 走看看