oracle学习笔记(二十) 子程序——函数与触发器
子程序——函数
语法
之前select语句中使用的函数,都是SQL内置函数,我们可以通过自定义函数更满足我们的需要。
自定义函数的语法和存储过程差不多。
create [or replace] $funtion_name$[(参数..)]
return $data_type$
is/as
begin
return result;
[exception]--异常处理
end $funtion_name$;
/
注意点:
- 函数只能接收参数模式只能是in,默认不写即可
- 函数参数和返回结果的类型只能是SQL的标准类型,PL/SQL特有类型不可使用(如boolean,string..)
使用自定义函数
SQL函数都是在select语句中使用,这也是函数与存储过程过程的区别
--编写一个函数获得指定部门的平均工资。
create or replace function avg_sal(p_deptno employee.sal%type)
return employee.sal%type
is
v_avg_sal employee.sal%type;
begin
select avg(nvl(sal,0) into v_avg_sal from employee where deptno=p_deptno;
return v_avg_sal;
end avg_sal;
/
--select语句使用
select dname,avg_sal(deptno) from department;
触发器
触发器,当满足某种事件时候系统会自动执行(隐式执行)
语法
create or replace trigger 触发器名
触发时间(BEFORE|AFTER) 触发事件(INSERT OR UPDATE OR DELETE) [OF 列名] ON 触发对象(表、视图等)
触发频率[for each row] --没有for each row的话默认为语句级触发器
when (触发条件)
declare
--声明变量部分
begin
--执行部分
end 触发器名;
说明
触发事件:
- DML语句(INSERT, UPDATE, DELETE语句对表或视图执行数据处理操作)、
- DDL语句(如CREATE、ALTER、DROP 语句在数据库中创建、修改、删除模式对象)、数据库系统事件(如系统启动或退出、异常错误)、
- 用户事件(如登录或退出数据库)
触发频率:
- 语句级 语句结束,触发器结束,只执行一次
- 行级 每行又满足触发器条件,都会执行一次触发器
触发条件:
NEW和OLD都是参考对象
NEW 代表新的数据对象(record)
OLD 代表原来的数据对象(record)
insert操作只有NEW, 代表着要插入的新记录
delete操作只会有OLD,代表着要删除的该条记录
update操作NEW 和 OLD 都有
PS:PLSQL使用的时候需要使用:
,when里面则不需要使用
条件量( boolean型 ):
可以在when语句或者是PLSQL中使用
- inserting: 代表做的是insert操作
- updating: 代表做的是update操作
- deleting: 代表做的是delete操作
例子
--示例 1:当向employee插入数据时自动填充(生成)主键值,(使用序列)
create or replace trigger trg_auto_generate_pk
before insert on employee
for each row --行级触发器,每一行满足条件触发
when(NEW.empno is null) --当插入的数据主键为空,自动生成,NEW表示当前INSERT的数据,不需要使用:
declare
empno number;
begin
--之前创建的序列
select emp_seq.nextval into empno from dual;
if inserting then
:NEW.empno := empno;--使用:引用
end if;
end trg_auto_generate_pk;
/
/*
示例 2:当删除数据时,自动备份
a. 创建备份表
b. 创建触发器
*/
--这里也可以使用动态SQL创建表
--创建备份表,只复制结构,不复制数据
create table employee_dump
as select * from employee where 1=2;
--创建触发器
create or replace trigger trg_backup_employee
after delete on employee
for each row
when(OLD.empno is not null)
declare
begin
insert into employee_dump values(:old.empno,:old.ename,:old.job,:old.mgr,:old.hiredate,:old.sal,:old.comm,:old.deptno);
commit;
exception
when others then
null; --还可以把异常的信息插入到日志表
end trg_backup_employee;
/
--禁用触发器:disable
alter trigger trg_backup_employee disable;
--启用触发器:enable
alter trigger trg_backup_employee enable;
--禁用某个表上所有的触发器:disable all triggers;
alter table employee disable all triggers;
--删除触发器
drop trigger trg_backup_employee;
oracle学习笔记(二十) 子程序——函数与触发器的更多相关文章
- python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法
python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法 在Python中字符串处理函数里有三个去空格(包括'\n', '\r', '\t', ' ')的函数 ...
- python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码
python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...
- python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字
python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...
- python3.4学习笔记(二十五) Python 调用mysql redis实例代码
python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...
- python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法
python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...
- oracle学习笔记(十九) 子程序——存储过程
子程序--存储过程 我们可以使用子程序来封装一下我们需要的操作,子程序又有存储过程,函数和触发器. 这里先学习存储过程~ 语法 create [or replace] procedure $proce ...
- (C/C++学习笔记) 二十四. 知识补充
二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...
- (C/C++学习笔记) 二十二. 标准模板库
二十二. 标准模板库 ● STL基本介绍 标准模板库(STL, standard template library): C++提供的大量的函数模板(通用算法)和类模板. ※ 为什么我们一般不需要自己写 ...
- (C/C++学习笔记) 二十. 文件和流
二十. 文件和流 ● 文件的概念 文件(file) 一. C/C++语言将文件作为字节序列(sequence of characters)来对待,但从编码角度,或说从对字节信息的解释来看,文件分为:文 ...
- oracle学习笔记(十五) PL/SQL语法结构以及使用
PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言. PL/SQL 是对 SQL 的扩展. 支持多种数据类型,如大对象和 ...
随机推荐
- linux性能优化cpu-02平均负载
每次我们系统变慢时,我们通常做的第一件事就是top命令或者uptime命令,看一下系统的负载情况,比如下面: 我在命令行中输入uptime 22:15:51 表示当前系统时间 up 13 min ...
- tomcat7解决jsp参数传递的中文乱码问题
解决jsp参数传递的中文乱码问题 制作人:全心全意 在jsp页面中,通过参数传递传递中文时,在显示参数值时中文内容变成了乱码.这是因为请求参数的文字编码方式与页面中的不一致造成的,所有的request ...
- 08.C语言:特殊函数
C语言:特殊函数 1.递归函数: 与普通函数比较,执行过程不同,该函数内部调用它自己,它的执行必须要经过两个阶段:递推阶段,回归阶段: 当不满足回归条件,不再递推: #include <stdi ...
- 中文情感分析 glove+LSTM
最近尝试了一下中文的情感分析. 主要使用了Glove和LSTM.语料数据集采用的是中文酒店评价语料 1.首先是训练Glove,获得词向量(这里是用的300d).这一步使用的是jieba分词和中文维基. ...
- i2c中应答信号信号总结
i2c如果用到主从的关系的时候,需要考虑: give_ack();//从器件发送,来表示占用总线,让sda总线保持低电平. get_ack();//主器件判断是否有器件占用总线,sda有器件占用,是低 ...
- 【Codeforces 140C】New Year Snowmen
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 每次都选择剩余个数最多的3个不同数字组成一组. 优先消耗剩余个数多的数字 这样能尽量让剩余的数字总数比较多,从而更加可能得到更多的3个组合 [ ...
- https://blog.csdn.net/zhi_sheng/article/details/78910082----mybatis写当天 当月的数据 时间段数据
https://blog.csdn.net/zhi_sheng/article/details/78910082---- mybatis写当天 当月的数据 时间段数据
- Failed to load slave replication state from table mysql.gtid_slave_pos: 1146: Table 'mysql.gtid_slave_pos' doesn't exist
http://anothermysqldba.blogspot.com/2013/06/mariadb-1003-alpha-install-on-fedora-17.html MariaDB 10. ...
- hdu 1853 KM算法
#include<stdio.h> #include<math.h> #include<string.h> #define N 200 #define inf 99 ...
- Thread的方法join()使用
join()的作用:Waits for this thread to die.等待线程对象销毁.在Thread源码中可以看到join源码是使用了wait()方法来实现等待功能. 因为join()内部使 ...