Oracle Day09 存储与触发器
1.存储
存储过程、存储函数:指存储在数据库中供所有用户程序调用的子程序。
--创建存储过程(procedure)
--用create procedure 命令建立存储过程。
格式: create or replace procedure 过程名(参数列表)
as
PLSQL子程序体;
SQL> create or replace procedure hh //创建存储过程
2 as
3 begin
4 dbms_output.put_line('世界您好!');
5 end;
6 / 过程已创建。
SQL> set serveroutput on;
SQL> begin //读取存储内容
2 hh();
3 end;
4 / 世界您好!
--例:给一个员工号,要求返回它的年薪
1 create or replace procedure nx(sd in number,psal out number)
2 as
3 csal emp.sal%type;
4 ccomm emp.comm%type;
5 begin
6 select sal,comm into csal,ccomm from emp where empno=sd;
7 psal :=csal*12 + nvl(ccomm,0);
8* end;
SQL> / 过程已创建。 SQL> ed
已写入 file afiedt.buf 1 declare
2 psal number;
3 begin
4 nx(7566,psal);
5 dbms_output.put_line(psal);
6* end;
SQL> /
35700
--存储函数(function)
--函数(function)是一个已命名的程序,可以带参数,并返回一个计算值。函数和过程的结构类似,但必须要有一个return返回语句,用于返回函数值。函数要指定函数名、结果值的类型和参数类型。
格式: create or replace function 函数名(参数列表)
return 函数值类型
as
PLSQL子程序体;
--过程和函数中的in 和 out
注意:过程和函数的区别: 函数可以有一个返回值,而过程没有返回值。
过程和函数都可以通过out指定一个或多个输出参数。可以利用out在过程和函数中实现返回多个值。
什么时候用存储过程或存储函数?
如果只有一个返回值,用存储函数;否则,用存储过程。
2.触发器
数据库触发器是一个与表相关联的、存储的PL/SQL程序。当一个特定的数据操作语句(insert,update,delete)在指定的表上发出时,Oracle自动的执行触发器中定义的语句序列。
创建触发器:
create or replace trigger
before/after
delete/insert/update of 列名
on 表名
(for each row) when(条件)
plsql块;
--触发器的类型
--语句级触发器: 在指定的操作语句之前或之后执行一次,不管语句影响了多少行。
--行级触发器(for each row): 触发语句作用的每一条记录都被触发。在行级触发器中使用 :old 和 :new伪记录变量,识别值的状态。
--触发器总结
--触发器用途: 1)数据确认
2)复杂的安全性检查
3)做审计,跟踪表上所做的数据操作
4)数据的备份和同步
--查询触发器、过程及函数
select * from user_trigger;
select * from user_source;
--触发语句与伪记录的值

SQL> create or replace trigger empinsert
2 before insert on emp
3 begin
4 if to_char(sysdate,'day') = '星期六' or to_char(sysdate,'hh24') not between 9 and 18 then raise_application_error(-20001,'不能在非上班时间做插入操作');
5 end if;
6 end;
7 / 触发器已创建 SQL> insert into emp(empno,deptno) values(1001,30);
insert into emp(empno,deptno) values(1001,30)
*
第 1 行出现错误:
ORA-20001: 不能在非上班时间做插入操作
ORA-06512: 在 "SCOTT.EMPINSERT", line 2
ORA-04088: 触发器 'SCOTT.EMPINSERT' 执行过程中出错
--例: 监控每个部门的人数不能超过6人
SQL> ed
已写入 file afiedt.buf 1 create or replace trigger empinsert
2 before insert on emp
3 for each row
4 declare
5 jnumber number;
6 begin
7 select count(*) into jnumber from emp where deptno=:new.deptno;
8 if jnumber>=6 then raise_application_error(-20001,'部门人数不能超过6人');
9 end if;
10* end;
SQL> / 触发器已创建 SQL> ed
已写入 file afiedt.buf 1* select count(*) from emp where deptno=30
SQL> / COUNT(*) //查看部门号为30的部门人数
----------
6 SQL> insert into emp(empno,deptno) values(123,30);
sert into emp(empno,deptno) values(123,30)
*
1 行出现错误:
ORA-20001: 部门人数不能超过6人
ORA-06512: 在 "SCOTT.EMPINSERT", line 5
ORA-04088: 触发器 'SCOTT.EMPINSERT' 执行过程中出错
Oracle Day09 存储与触发器的更多相关文章
- oracle存储过程和存储函数&触发器
oracle存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程,存储函数 存储过程和存储函数的相同点:完成特定功能的程序 存储过程和存储函数的区别:是否用return语句返回值 ...
- Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
---视图 ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中. ---一个由查询语句定义的虚拟表. ---查询语句创建表 create table emp a ...
- ORACLE数据库存储结构简介(转)
首先,oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构,对于这两种存储结构,oracle是分别进行管理的. 逻辑存储结构:oracle内部的组织和管理数据的方式. 物理存储结构:o ...
- 【Oracle】详解ORACLE中的trigger(触发器)
本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2. ...
- ORACLE PL/SQL:触发器
ORACLE PL/SQL 触发器 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8 ...
- oracle rac存储安装
oracle rac 10.2 的在 linux 上的存储选项 博客分类: Oracle OracleLinux项目管理配置管理 Oracle 集群需要存储的软件和数据 项目 内容 最少磁盘空间 C ...
- Oracle 学习笔记 19 -- 触发器和包浅析(PL/SQL)
触发器是存放在数据库中的一种特殊类型的子程序.不能被用户直接调用,而是当特定事件或操作发生时由系统自己主动 调用执行.触发器不能接受參数.所以执行触发器就叫做触发或点火.Oracle事件指的是数据库的 ...
- .Net程序员学用Oracle系列(8):触发器、作业、序列、连接
1.触发器 2.作业 2.1.作业调度功能和应用 2.2.通过 DBMS_JOB 来调度作业 3.序列 3.1.创建序列 3.2.使用序列 & 删除序列 4.连接 4.1.创建连接 4.2.使 ...
- Oracle 数存储——物理结构
Oracle存储——逻辑结构 Oracle 数据库存储物理结构 物理存储结构是实际的数据存储单元,对应于操作系统文件. oracle数据库就是由驻留在服务器的磁盘上的这些操作系统文件组成的. 物理存储 ...
随机推荐
- hdu4284之字典树
Intelligent IME Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 利用jquery对ajax操作,详解原理(附代码)
1. jQuery load() 方法 jQuery load() 方法是简单但强大的 AJAX 方法. load() 方法从服务器加载数据,并把返回的数据放入被选元素中. 语法: $(selecto ...
- java基础知识拾遗(三)
1.类加载 bootstrap classloader -引导(也称为原始)类加载器,它负责加载Java的核心类. extension classloader -扩展类加载器,它负责加载JRE的扩展目 ...
- 克隆虚拟机win8系统后注意修改安全标识(SID)
克隆虚拟机win8系统后注意修改安全标识(SID) 克隆虚拟机系统后两个系统硬件配置一样,需要注意修改:security ID ,MAC,计算机名,IP地址,产品激活 重置工具:sysprep.e ...
- js区分汉字和字符,校验长度
遇到这么一个问题, 长度限制输入150个英文字符(小于等于150个英文字符长度),超出则直接禁止输入,并提醒:摘要输入必须小于等于75个中文字符长度! 长度校验倒是没问题,但是要区分汉字还是英文 ...
- 2017 年不可错过的开发工具 Top 50
想知道 2017 年有哪些值得关注的开发工具吗?StackShare 年度开发工具排行榜来啦! StackShare.io 是一个开发者工具及服务分享平台,致力于发现并分享开发者使用的开发工具.服务与 ...
- LightOJ 1030 Discovering Gold
期望,$dp$. 设$ans[i]$为$i$为起点,到终点$n$获得的期望金币值.$ans[i]=(ans[i+1]+ans[i+2]+ans[i+3]+ans[i+4]+ans[i+5]+ans[i ...
- python爬虫框架scrapy初识(一)
Scrapy介绍 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.所谓网络爬虫,就是一个在网上到处或定向抓取数据的 ...
- Maven之(五)Maven仓库
本地仓库 Maven一个很突出的功能就是jar包管理,一旦工程需要依赖哪些jar包,只需要在Maven的pom.xml配置一下,该jar包就会自动引入工程目录.初次听来会觉得很神奇,下面我们来探究一下 ...
- MATLAB编译器
1. mcc filename.cpp 或者mcc filename.c 可以将cpp或者c源程序文件,编译为filename.mexw32(32位系统)或者filename.mexw64(64位系统 ...