zoukankan      html  css  js  c++  java
  • 索引,视图,存储过程和存储函数

    1.索引:
    select
    * from emp; -- 1.自动创建索引:Oracle 会自动为主键和唯一键创建索引 --- 自动创建的索引无法手动删除,只有在删除主键或唯一键时,对应的索引一并删除 alter table emp add constraint enam_uiq unique (ename); alter table emp drop constraint enam_uiq -- 2.手动创建索引:对于查询条件中经常使用到的查询字段可以添加索引 create index index_name on emp(ename) -- index_name:索引名称,emp:表名, ename:索引字段 --删除索引:只能删除手动添加的索引 drop index index_name

    2.视图:视图(view),也称虚表, 不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的。视图只有逻辑定义。每次使用的时候,只是重新执行SQL。视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中。通过视图看到的数据存放在基表中。

    作用

    1)提供各种数据表现形式, 可以使用各种不同的方式将基表的数据展现在用户面前, 以便符合用户的使用习惯(主要手段: 使用别名);

    2)隐藏数据的逻辑复杂性并简化查询语句, 多表查询语句一般是比较复杂的, 而且用户需要了解表之间的关系, 否则容易写错; 如果基于这样的查询语句创建一个视图, 用户就可以直接对这个视图进行"简单查询"而获得结果. 这样就隐藏了数据的复杂性并简化了查询语句.这也是oracle提供各种"数据字典视图"的原因之一,all_constraints就是一个含有2个子查询并连接了9个表的视图(在catalog.sql中定义);

    3)执行某些必须使用视图的查询. 某些查询必须借助视图的帮助才能完成. 比如, 有些查询需要连接一个分组统计后的表和另一表, 这时就可以先基于分组统计的结果创建一个视图, 然后在查询中连接这个视图和另一个表就可以了;

    4)提供某些安全性保证. 视图提供了一种可以控制的方式, 即可以让不同的用户看见不同的列, 而不允许访问那些敏感的列, 这样就可以保证敏感数据不被用户看见;

    5)简化用户权限的管理. 可以将视图的权限授予用户, 而不必将基表中某些列的权限授予用户, 这样就简化了用户权限的定义。

    语法: create [ or replace ] [ force ] view [schema.]view_name
                          [ (column1,column2,...) ]
                          as 
                          select ...
                          [ with check option ]                      [ constraint constraint_name ]
                          [ with read only ];

    tips:
     1 or replace: 如果存在同名的视图, 则使用新视图"替代"已有的视图
     2 force: "强制"创建视图,不考虑基表是否存在,也不考虑是否具有使用基表的权限
     3 column1,column2,...视图的列名, 列名的个数必须与select查询中列的个数相同; 如果select查询包含函数或表达式, 则必须为其定义列名.此时, 既可以用column1, column2指定列名, 也可以在select查询中指定列名.
     4 with check option: 指定对视图执行的dml操作必须满足“视图子查询”的条件即,对通过视图进行的增删改操作进行"检查",要求增删改操作的数据, 必须是select查询所能查询到的数据,否则不允许操作并返回错误提示. 默认情况下, 在增删改之前"并不会检查"这些行是否能被select查询检索到. 
     5 with read only创建的视图只能用于查询数据, 而不能用于更改数据.

    -- ===========================视图=========================================
    --视图,就是一个虚表,可以用这个表查询数据
    --视图,就是一个命名的查询语句。可以对表字段数据分权
    -- 视图主要是用来做查询的,不能做DML操作,对视图的DML操作会影响原表数据
    -- 1.创建一个名为hr_emp的视图
    create or replace view v_hr_emp
    as
    select * from emp
    
    -- 2.创建项目mgr_emp
    create or replace view v_mgr_emp
    as
    select empno,ename,job,mgr,deptno
    from emp
    
    -- 查询视图:
    select * from v_mgr_emp
    -- 删除视图,不会影响原来表数据 drop view v_mgr_emp;

    ---查询目前每个岗位的平均工资、工资总和、最高工资和最低工资。此时创建视图就必须制定列名

    create or replace view vw_emp_job_sal(job,avgsal,sumsal,maxsal,minsal)
    as
    select job,avg(sal),sum(sal),max(sal),min(sal) from emp
    group by job

    存储函数:

    create or replace function get_sal(dpno number)
     return number
     is
       v_sumSal number(10):=0;
       Cursor sal_cursor is select sal from emp where deptno=dpno;
      begin
        for c in sal_cursor loop
          v_sumSal:=v_sumSal+c.sal;
        end loop;
        return v_sumSal;
      end;

    存储过程:

    /**
      对给定部门(作为参数)的员工进行加薪,在职时间为(?,95)期间,加薪 5%
                                                       (95,98)期间,加薪 3%
                                                       (98,?)期间,加薪 1%           
     得到以下返回结果:此次加薪,公司需要额外付出的成本 ,定义一个out类型的输出变量
    */
    
    create or replace procedure add_sal(dept_id number,tem_sal out number)
    is
           v_i number(4,2):=0;
           cursor sal_cursor is select empno,sal,hiredate  from emp where deptno = dept_id;
    begin
        tem_sal:=0;
        for c in sal_cursor loop
             if to_char(c.hiredate,'yyyy') <'1995'  then v_i:=0.05;
             elsif to_char(c.hiredate,'yyyy')<'1998' then v_i:=0.03;
             else v_i:=0.01;
             end if;
               --1.更新工资
             update emp set sal = sal*(1+v_i) where empno = c.empno;
               --2.付出成本
             tem_sal:=tem_sal + v_i * c.sal;
        end loop;
        dbms_output.put_line(tem_sal);
    end;

    调用以上的存储过程,在plsql命名中输入ed,

     进入Text editor界面:

    在sql命令中输入 /,得到存储过程结果

  • 相关阅读:
    超级英雄Hero
    2019 CSP-J 游记(CQ LNBS考场 的退役之战)
    一文梳理Web存储,从cookie,WebStorage到IndexedDB
    一文梳理同源策略与跨域技术
    一文梳理JavaScript中的this
    一文梳理JavaScript 事件循环(Event Loop)
    简单梳理JavaScript垃圾回收机制
    一文梳理JS事件
    src与href
    深入理解CSS定位—浮动模型
  • 原文地址:https://www.cnblogs.com/wsy0202/p/12495156.html
Copyright © 2011-2022 走看看