一、程序包和包体

程序包(package):存储在数据库中的一组子程序、变量定义。在包中的子程序可以被其它程序包或子程序调用。但如果声明的是局部子程序,则只能在定义该局部子程序的块中调用该局部子程序。

它具有面向对象程序设计语言的特点,是对这些PL/SQL 程序设计元素的封装。包类似于JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。

create or replace package stuinfo as
  type stucur is ref cursor;
  procedure showname(scla in number, stus out stucur);
end stuinfo;

create or replace package body stuinfo as
  procedure showname(scla in number, stus out stucur) as
  begin
    open stus for
      select * from student s where s.class = scla;

  end;

end stuinfo;
-- Created on 2017/8/16 by ADMINISTRATOR
declare
  -- Local variables here
  i integer;
  type stuc is ref cursor;
  sts stuc;
  stu student%rowtype;

begin
  -- Test statements here
  stuinfo.showname(,sts);
  loop
    fetch sts
    into stu;
    exit when sts%notfound;
    dbms_output.put_line(stu.sname);
    end loop;
end;

二、

1.触发器:

触发器和存储过程类似,触发器可以调用存储过程,但是触发器不需要调用,触发器只能由数据可的特定事件来触发。

特定的触发事件:

用户在指定的表或视图中座DML操作,主要有:insert,update,delete等。

用户做DDL操作,主要有:create,alter,drop等。

数据库事件,主要包括:logon/logoff用户的登录或注销。

startup/shutdown数据库的打开或关闭。

erros特定的错误信息等。

2.触发器的作用:

触发器可以根据不同的事件进行调用,有着更加精细的控制能力,可以完成很多普通语句完成不了的功能,主要作用:

自动生成自增长的字段。

执行更复杂的业务逻辑。

防止无意义的操作。

提供审计。

允许或限制修改某些表。

实现完整性规则。

保证数据的同步复制。

触发器的类型:

3.触发器的类型

数据操作语言(DML)触发器:

这种触发器定义到表上,对表执行insert,update,delete操作是可以激发该类型的触发器。利用该触发器可以复制,检查,替换某种符合指定条件的数据。按照触发器级别可以分两种,第一种行级触发器,表示每条记录修改时都会激发给触发器;第二种语句级触发器,表示sql语句执行实际发该触发器,与修改多少条记录无关。以数据的更改事件为准,则分为before和after两种。

数据定义语言(DDL)触发器。当create,alter,drop模式对象是会触发相关触发器。在oracle中可以简单的理解一个用户就有一个和他同名的模式,利用它可以使某些表不能被修改或删除。

复合触发器:

Oracle11g的新特性,相当于在一个触发器中包含了四种触发器,包含了before类型的语句级,before类型的行级,after类型的语句级,after类型的行级。这使得变量的传递更加方便。

instead of触发器:

这种类型的触发器通常作用在视图上,对由多个源表的视图座DML操作通常是不被允许的,这种情况可以利用instead of触发器解决问题。利用它可以把对视图的DML操作转换成对多个源表进行操作。

用户和系统事件触发器:

作用在数据库上游数据库事件激发的触发器,如登录注销,利用它可以记录数据库的登录情况。

4.触发器例子:

--建立一个触发器, 当职工表 emp 表被删除一条记录时,把被删除记录写到职工表删除日志表中去。
;
CREATE OR REPLACE TRIGGER tr_del_emp
   BEFORE DELETE --指定触发时机为删除操作前触发
   ON scott.emp
   FOR EACH ROW   --说明创建的是行级触发器
BEGIN
   --将修改前数据插入到日志记录表 del_emp ,以供监督使用。
   INSERT INTO emp_his(deptno , empno, ename , job ,mgr , sal , comm , hiredate )
       VALUES( :old.deptno, :old.empno, :old.ename , :old.job,:old.mgr, :old.sal, :old.comm, :old.hiredate );
END;
;
DROP TABLE emp_his;
DROP TRIGGER del_emp;

三、视图和索引

视图是一个或多个表或视图导出的表。视图是一个虚表,试图所对应的数据不进行实际存储,数据库中只存储视图的定义,对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基表。

我们可以像使用表一样使用视图,但需要注意的是:查询视图没有什么限制,插入/更新/删除视图的操作会受到一定的限制;所有针对视图的操作都会影响到视图的基表;为了防止用户通过视图间接修改基表的数据,可以将视图创建为只读视图(带上with read only选项)。

--建表:
create table Student
 (Id ),
  Name ),
  Sex ),
  Class_id ));

create unique index index_id on Student(Id);

create  index index_name on Student(Name);

create bitmap index index_sex on  Student(Sex);
conn scott/tiger;

grant insert,update,delete on emp to system;

conn system/orcl1234;

create or replace VIEW v_emp
as
select empno,ename,job,hiredate,deptno
from scott.emp;

索引

为了提高查询的速度,当用户对查询速度不满意而需要对数据库的性能进行调校时,优先考虑建立索引。
CREATE INDEX idx_ename ON employee (ename, sal DESC);

适当的使用索引可以提高数据检索速度,可以给经常需要进行查询的字段创建索引。

向表中“添加”行或从表中“删除”行时,必须花费额外的时间来更新该表的索引,所以当需要从大表中检索少数几行时创建索引。一般我们认为当任何单个查询要检索的行小于整个表总行数的10%时,索引就非常有用。

表的主键和唯一键将自动创建索引。

PL/SQL 编程(三 )程序包和包体,触发器,视图,索引的更多相关文章

  1. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

  2. 二十三、oracle pl/sql分类三 包

    包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成.1).我们可以使用create package命令来创建包,如:i.创建一个包sp_packageii.声明该包有一个过程update_sal ...

  3. PL/SQL编程基础(三):数据类型划分

    数据类型划分 在Oracle之中所提供的数据类型,一共分为四类: 标量类型(SCALAR,或称基本数据类型) 用于保存单个值,例如:字符串.数字.日期.布尔: 标量类型只是作为单一类型的数据存在,有的 ...

  4. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  5. pl/sql编程

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  6. ORACLE PL/SQL编程之八:把触发器说透

    原文:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 ...

  7. [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

    原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...

  8. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

    原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE P ...

  9. [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)

    原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...

随机推荐

  1. PHP连接数据库、创建数据库、创建表的三种方式

    这篇博客主要介绍了三种方式来连接MySQL数据库以及创建数据库.创建表.(代码是我在原来的基础上改的) MySQLi - 面向对象 MySQLi - 面向过程 PDO MySQLi 面向对象 < ...

  2. JavaWeb 后端 <八> 之 JDBC基礎(全)

    一.JDBC简介 1.JDBC是SUN公司为了简化操作数据推出一套规范.数据库厂商的驱动就是对JDBC的实现. 2.Java Data Base Connectivity(java数据库连接),它主要 ...

  3. HTTP消息中Header头部信息整理

    1.HTTP请求方式 GET 向Web服务器请求一个文件 POST 向Web服务器发送数据让Web服务器进行处理 PUT 向Web服务器发送数据并存储在Web服务器内部 HEAD 检查一个对象是否存在 ...

  4. 创建 Machine - 每天5分钟玩转 Docker 容器技术(46)

    对于 Docker Machine 来说,术语 Machine 就是运行 docker daemon 的主机.“创建 Machine” 指的就是在 host 上安装和部署 docker.先执行 doc ...

  5. opnet仿真过程中SEED的概念问题 分类: opnet 2014-11-02 15:25 69人阅读 评论(0) 收藏

    仿真配置中SEED的概念:仿真随机种子,是产生随机数的种子值,反应随机数的状态.只要选定一个种子值,整个随机事件系统就固定了,复杂仿真的随机过程就成了一次实现.目的是测试仿真系统的稳健性,具体来说,针 ...

  6. webpack2 项目

    webpack2 项目   实例gif图: 目录截图: 目录介绍: dist目录(最后生成的目录,里面文件为配置webpack自动生成的): c/:css文件夹; i/:img文件夹; j/:js文件 ...

  7. iOS Socket 整理以及CocoaAsyncSocket、SRWebSocket源码解析(一)

    写在准备动手的时候: Socket通讯在iOS中也是很常见,自己最近也一直在学习Telegram这个开源项目,Telegram就是在Socket的基础上做的即时通讯,这个相信了解这个开源项目的也都知道 ...

  8. 我的"Hello World!"之旅

    不知从何谈起,回想起三年前的自己,那会是高三:同时也是一个让无数骚年悸动的年代,那时候的我也在一个叫做“召唤师峡谷”神奇的地方闯荡了两年.那么,记忆又会回到2012年的元旦,伴随着几个好友,偷偷摸摸地 ...

  9. [补档]暑假集训D5总结

    %dalao 今天又有dalao来讲课,讲的是网络流 网络流--从入门到放弃:7-29dalao讲课笔记--https://hzoi-mafia.github.io/2017/07/29/27/   ...

  10. js 重载(overload)

    1.js中不支持重载的语法.(因为js不允许多个同名函数存在) 解决:使用arguments类数组对象接收调用时所有传入的参数值. 2. arguments可以使用length属性,通过下标访问,不能 ...