子程序——函数

语法

之前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学习笔记(二十) 子程序——函数与触发器的更多相关文章

  1. python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法

    python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法 在Python中字符串处理函数里有三个去空格(包括'\n', '\r', '\t', ' ')的函数 ...

  2. python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码

    python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...

  3. python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字

    python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...

  4. python3.4学习笔记(二十五) Python 调用mysql redis实例代码

    python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...

  5. python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法

    python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...

  6. oracle学习笔记(十九) 子程序——存储过程

    子程序--存储过程 我们可以使用子程序来封装一下我们需要的操作,子程序又有存储过程,函数和触发器. 这里先学习存储过程~ 语法 create [or replace] procedure $proce ...

  7. (C/C++学习笔记) 二十四. 知识补充

    二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...

  8. (C/C++学习笔记) 二十二. 标准模板库

    二十二. 标准模板库 ● STL基本介绍 标准模板库(STL, standard template library): C++提供的大量的函数模板(通用算法)和类模板. ※ 为什么我们一般不需要自己写 ...

  9. (C/C++学习笔记) 二十. 文件和流

    二十. 文件和流 ● 文件的概念 文件(file) 一. C/C++语言将文件作为字节序列(sequence of characters)来对待,但从编码角度,或说从对字节信息的解释来看,文件分为:文 ...

  10. oracle学习笔记(十五) PL/SQL语法结构以及使用

    PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言. PL/SQL 是对 SQL 的扩展. 支持多种数据类型,如大对象和 ...

随机推荐

  1. [Luogu] P4254 [JSOI2008]Blue Mary开公司

    题目背景 Blue Mary 最近在筹备开一家自己的网络公司.由于他缺乏经济头脑,所以先后聘请了若干个金融顾问为他设计经营方案. 题目描述 万事开头难,经营公司更是如此.开始的收益往往是很低的,不过随 ...

  2. UVA - 808 Bee Breeding (建立坐标系&找规律)

    题目: 输入两个格子的编号a和b(a,b≤10000),求最短距离.例如,19和30的距离为5(一条最短路是19-7-6-5-15-30). 思路: 如图建立坐标系,然后看两个点的向量如果位于二四象限 ...

  3. fiddler培训

    fiddler  在客户端和服务器中间做一个代理 ,只能截获http或HTTPS的请求 代理地址127.0.0.1  端口8888 反向代理,正向代理 浏览器上设置代理地址和端口 左边是session ...

  4. 一篇入门MongoDB

    目录 1.MongoDB 基本介绍 2.MongoDB 基本概念 3.数据库操作 4.集合操作 5.文档操作 6.查询条件 7.索引 1.MongoDB 基本介绍 (1)安装 MongoDB 简单来说 ...

  5. chrome浏览器安装网页测试插件postman的图文介绍

    用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具.今天给大家介绍的这款网页调试工具不仅可以 ...

  6. BZOJ 3916 [Baltic2014]friends

    [题解] 暴力枚举添加字符的位置,然后判断去掉这个位置的字符串是否有由两个相同的串拼接而成.本题的n的范围为200W,暴力判断会TLE,所以要使用哈希. #include<cstdio> ...

  7. [bzoj1820][JSOI2010][Express Service 快递服务] (动态规划)

    Description 「飞奔」快递公司成立之后,已经分别与市内许多中小企业公司签订邮件收送服务契约.由于有些公司是在同一栋大楼内,所以「飞奔」公司收件的地点(收件点)最多只有m点 (1, 2, …, ...

  8. Leetcode 135.分糖果

    分发糖果 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻的孩 ...

  9. 放大的X

    Problem Description 请你编程画一个放大的’X’.如3*3的’X’应如下所示: X X XX X 5*5的’X’如下所示:X X X X X X XX X   Input 输入数据第 ...

  10. 试来试去,WIN下最简单的WIN API开发工具,Pelles C就好啦

    昨晚试过N个,不是太大,就是不容易和WIN API集成. 今早一试就灵了个.... Pelles C. Pelles C是一款windows下的C IDE,支持调试,且为免费.它有一个高效率的链接器, ...