子程序——函数

语法

之前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. Re0:DP学习之路 母牛的故事 HDU - 2018

    解法 一定要注意斐波那契数列的原始意义,斐波那契数列也叫作兔子数列是兔子繁衍的一种表示方法.同样适用于别的情况的动物繁衍问题 原始的是3个月一胎现在四个月那么方程就是 f(n)=n n<=4 f ...

  2. Laravel5.5 综合使用

    使用 Laravel5.5 开发一个自动交割的项目,把使用到的开源扩展包及特性整理起来,以供后续使用. 一.安装IDE提示工具 Laravel IDE Helper 是一个极其好用的代码提示及补全工具 ...

  3. 窥探原理:实现一个简单的前端代码打包器 Roid

    roid roid 是一个极其简单的打包软件,使用 node.js 开发而成,看完本文,你可以实现一个非常简单的,但是又有实际用途的前端代码打包工具. 如果不想看教程,直接看代码的(全部注释):点击地 ...

  4. PyCharm开发GUI之PyQt安装

    开发环境 PyCharm 2018.3.3python3.7 1 安装pyqt5 pip install PyQt5-tools 2 配置PyCharm 2.1 配置设计器 其中,program为C: ...

  5. 微信小程序初探(二):阅读官方demo源码

    阅读demo有助于理解逻辑,而且demo源码中应该包含了框架开发人员想要表达的意思的精华,先从app.js着手来阅读. 附带贴下说明: https://mp.weixin.qq.com/debug/w ...

  6. HUD——1286 找新朋友

    思路: 裸的欧拉函数 代码: #include<cstdio> #include<cstring> #include<cstdlib> #include<io ...

  7. Ubuntu 16.04安装Kdbg替代Insight实现汇编的调试

    Insight已经不能使用APT进行安装,且如果使用源码安装时需要修改.所以只能放弃,转投使用Kdbg. 安装: sudo apt-get install kdbg 使用: nasm -f elf64 ...

  8. 深入学习理解java-ThreadLocal

    导读 首先,ThreadLocal 不是用来解决共享对象的多线程訪问问题的,普通情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其它线程是不须要訪问的,也訪问不到 ...

  9. 调试JDK源代码-一步一步看HashMap怎么Hash和扩容

    调试JDK源代码-一步一步看HashMap怎么Hash和扩容 调试JDK源代码-ConcurrentHashMap实现原理 调试JDK源代码-HashSet实现原理 调试JDK源代码-调试JDK源代码 ...

  10. HR系统-人员申请单

    部门在人员缺失时,须要进行人员申请, 申请会涉及到单据的建立及审核.单据建立界面例如以下: