存储过程和函数以及触发器

PL/SQL程序块都是匿名块,当需要再次调用这些程序块时,只能再次编写程序块的内容,然后又oracle重新编译执行,为了提高系统的应用性能,oracle提供了一系列“命名程序块”,包括存储过程,函数,触发器和包(包没有涉及)。本章将介绍这些命名程序块。

1.创建存储过程

create [ or replace ] procedure 存储过程名称(参数名 in 类型, 参数名  out 类型, 参数名 in out 类型)
is|as
变量声明部分;
begin
逻辑部分
[exception
异常处理部分]
end;

2.三种参数的使用

2.1 参数in指定输入参数,有存储过程的调用者为其赋值。

2.2参数out指定输出参数,由存储过程中的语句为其赋值,并返回给用户。

create procedure select_emp
(emp_num in number,emp_name out varchar2) as
begin
select ename into emp_name
from emp where empno=emp_num;
end select_emp;

2.3 IN OUT参数,既可以传进来也可以传出去

create procedure exchange_value
(value in out number, value2 in out number)
as
temp1 number;
temp2 number;
begin
temp1 = value1;
temp2 = value2;
value1=temp2;
value2=temp1
end xchange_value;

3.函数

函数与存储过程很相似,他同样可以接受用户的传递值,也可以向用户返回值,不同之处在于函数必须有返回值。

语法如下:

create [ or replace ] function 函数名称(参数名称 参数类型, 参数名称 参数类型, ...)
return 结果变量数据类型
id
变量声明部分;
begin
逻辑部分;
return 结果变量;
[exception
异常处理部分]
end;

例子:

create function get_name(emp_num number)
return varchar2 as
emp_name emp.ename%TYPE
begin
select ename into emp_name from emp where empno=emp_num;
return emp_name;
end get_name;

4.触发器

触发器是一种特殊的存储过程,它在发生某种数据库事件事由oracle系统自动触发,触发器通常用来加强完整性约束和业务规则等,对于表来说,触发器可以实现比CHECK约束更复杂的约束。

触发器主要类型由DDL触发器、系统触发器、instead of触发器和DDL触发器

4.1创建触发器

create [or replace] trigger 触发器名
before | after
[delete | insert | update [of 列名...]]
ON 表名
[for each row] [when(条件)]
declare
……
begin
PLSQL 块
end;

4.2DML触发器

DML触发器主要包括insert、delete、updata操作,任何触发器都可以按触发时间分为after或者before触发器。

接下来举个例子:

创建一个学生表:

create table student(
sid number(),
sname varchar2(),
sage number()
);

我们插入几条记录

insert into student values (,'xiaoqing',);
insert into student values (,'xiaojing',);
insert into student values (,'xiaoxi',);

接下来创建一个表用来存储对student的修改

creat table record(

content varchar2(),

rtime timestamp

);

接下来我们创建一个触发器,要求更改student表后,在record表中记录修改操作,并保存修改前的行数据,创建触发器的语句如下:

create trigger update_student_trigger
after update
on student
for each row
begin
insert into record values
('执行了update操作,执行该操作前的数据为:sid=' || :OLD.sid || ',sname=' || :OLD.sname || ',sage='|| :OLD.sage,SYSDATE);
end update_student_trigger;

4.3instead of触发器

用来执行一个替代操作来代替触发事件的操作,而触发事件本身最终不会执行。

不过instead of不能针对表,只能针对视图进行操作,我们知道如果视图的列如果进行了数学或者函数运算,就不能对该列进行DML操作,这时可以使用instead of触发器。

create view student_view
as
select sid,sname,sage+ new_age
from student
with check option;

如果我们直接对视图进行插入数据操作会报错,我们可以使用instead of触发器来解决这个问题。

create trigger insteadod_student_view
instead of insert
on student_view
for each row
begin
instead into student(sid,sname,sage)
values( :new.sid,:new.sname,:new.new_age);
end insteadof_studnet_view;

4.3系统触发器

系统触发器是指数据库系统事件触发的触发器,比如登录、关闭数据库。

4.4DDL触发器

DDL触发器由DDL语句触发触发事件包括alter、create、drop等。创建DDL触发器需要用户有DBA权限。

oracle数据库(六)的更多相关文章

  1. 一个小时学会Oracle数据库

    一.数据库概要 二.Oracle简介 三.安装运行Oracle数据库 四.使用GUI操作MySQL 五.使用SQL访问Oracle数据库 六.下载程序.帮助.视频 Oracle视频下载(111班):h ...

  2. docker 实战---使用oracle xe作为开发数据库(六)

    oracle作为oltp的大佬,非常多行业应用都会用到它.那么在开发的过程中就不可避免的要使用oracle数据库,oracle数据库的版本号有好多,当中express版本号是免费的开发版.它的主要限制 ...

  3. Oracle数据库基本操作 (六) —— 数据的导出与导入

    一.cmd 下登录oracle数据库下的指定用户 方式一:命令行明文连接登录 打开cmd,输入:sqlplus/nolog 输入:conn username/passworld@数据库实例名 方式二: ...

  4. Oracle 数据库语句大全

    Oracle数据库语句大全 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CH ...

  5. Oracle数据库异机升级

    环境: A机:RHEL5.5 + Oracle 10.2.0.4 B机:RHEL5.5 需求: A机10.2.0.4数据库,在B机升级到11.2.0.4,应用最新PSU补丁程序. 目录: 一. 确认是 ...

  6. Oracle数据库基础知识

    oracle数据库plsql developer   目录(?)[-] 一     SQL基础知识 创建删除数据库 创建删除修改表 添加修改删除列 oracle cascade用法 添加删除约束主键外 ...

  7. 循序渐进Python3(十二) --2--  web框架之django简单实现oracle数据库操作

    在 Django 中构建 Oracle 数据库支持的 Web 应用程序 了解如何配置 Django 以便与 Oracle 数据库交互,并使用 ORM 进行数据库连接.             产能在软 ...

  8. PL/SQL远程备份和恢复Oracle数据库

    (转自:http://blog.csdn.net/huchunfu/article/details/25165901) 在客户端远程备份的文件保存在数据库所在主机上,不会直接拷贝到客户端.—————— ...

  9. Oracle 数据库日常巡检

    1. 检查数据库基本状况 包含:检查Oracle实例状态,检查Oracle服务进程,检查Oracle监听进程,共三个部分. 1.1. 检查Oracle实例状态 select instance_name ...

随机推荐

  1. Java8 流式 API(`java.util.stream`)

    熟悉 ES6 的开发者,肯定对数组的一些方法不是很陌生:map.filter 等.在对一组对象进行统一操作时,利用这些方法写出来的代码比常规的迭代代码更加的简练.在 C♯ 中,有 LINQ 来实现.那 ...

  2. html5 audio标签切换播放音乐的方法

    html5 audio标签切换播放音乐的方法<pre><audio id="music1" preload loop="loop">&l ...

  3. storm杂记+性能调优

    1.默认情况下: 1个supervisor节点启动4个worker进程. 每一个topology默认占用一个worker进程. 每个worker会启动executor. 每个executor默认启动一 ...

  4. python读取word中的段落、表、图+++++++++++Doc转换Docx

    读取文本.图.表.解压信息 import docx import zipfile import os import shutil '''读取word中的文本''' def gettxt(): file ...

  5. unity延迟加载图片

    把加载图片所需要的信息封装成一个任务(自己写的类,包括路径,回调等信息),再将该任务添加到自己写的任务池中(在update中执行任务委托),由于只是添加任务操作,加载完成后自动调用回调函数实例化,对主 ...

  6. json对象与string相互转换教程

    一.说明 1.1 背景说明 json对象与string相互转换,这东西想写了很多次,但总觉得网上教程比较成熟,所以之前每次都放弃了.但今天又被string转json对象折腾了半天,实在受不了,所以还是 ...

  7. 最细的eclipse 安装maven踩过的坑

    Eclipse安装maven插件踩过的坑 在线安装maven eclipse安装maven插件,在网上有各种各样的方法,博主使用过的也不止一种,但是留下的印象总是时好时不好,同样的方法也不确定那一次能 ...

  8. InstantiationAwareBeanPostProcessor 分析

    Cglib之Enhancer创建动态代理https://blog.csdn.net/yaomingyang/article/details/82762697 https://blog.csdn.net ...

  9. .net core mvc启动顺序以及主要部件4-MVC

    前面三章已经把MVC启动过程以及源代码做了讲解,本章开始正式MVC,mvc全称叫model view controller,也就是把表现层又细分三层,官网的图片描述: 默认创建了一个.net core ...

  10. javascript query string

    function getQueryVariable(variable) { var query = window.location.search.substring(1); var vars = qu ...