oracle数据库(六)
存储过程和函数以及触发器
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数据库(六)的更多相关文章
- 一个小时学会Oracle数据库
一.数据库概要 二.Oracle简介 三.安装运行Oracle数据库 四.使用GUI操作MySQL 五.使用SQL访问Oracle数据库 六.下载程序.帮助.视频 Oracle视频下载(111班):h ...
- docker 实战---使用oracle xe作为开发数据库(六)
oracle作为oltp的大佬,非常多行业应用都会用到它.那么在开发的过程中就不可避免的要使用oracle数据库,oracle数据库的版本号有好多,当中express版本号是免费的开发版.它的主要限制 ...
- Oracle数据库基本操作 (六) —— 数据的导出与导入
一.cmd 下登录oracle数据库下的指定用户 方式一:命令行明文连接登录 打开cmd,输入:sqlplus/nolog 输入:conn username/passworld@数据库实例名 方式二: ...
- Oracle 数据库语句大全
Oracle数据库语句大全 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CH ...
- Oracle数据库异机升级
环境: A机:RHEL5.5 + Oracle 10.2.0.4 B机:RHEL5.5 需求: A机10.2.0.4数据库,在B机升级到11.2.0.4,应用最新PSU补丁程序. 目录: 一. 确认是 ...
- Oracle数据库基础知识
oracle数据库plsql developer 目录(?)[-] 一 SQL基础知识 创建删除数据库 创建删除修改表 添加修改删除列 oracle cascade用法 添加删除约束主键外 ...
- 循序渐进Python3(十二) --2-- web框架之django简单实现oracle数据库操作
在 Django 中构建 Oracle 数据库支持的 Web 应用程序 了解如何配置 Django 以便与 Oracle 数据库交互,并使用 ORM 进行数据库连接. 产能在软 ...
- PL/SQL远程备份和恢复Oracle数据库
(转自:http://blog.csdn.net/huchunfu/article/details/25165901) 在客户端远程备份的文件保存在数据库所在主机上,不会直接拷贝到客户端.—————— ...
- Oracle 数据库日常巡检
1. 检查数据库基本状况 包含:检查Oracle实例状态,检查Oracle服务进程,检查Oracle监听进程,共三个部分. 1.1. 检查Oracle实例状态 select instance_name ...
随机推荐
- Python3+WebSockets实现WebSocket通信
一.说明 1.1 背景说明 前段时间同事说云平台通信使用了个websocket的东西,今天抽空来看一下具体是怎么个通信过程. 从形式上看,websocket是一个应用层协议,socket是数据链路层. ...
- C语言结构体的“继承”
这里说的继承有点像C++里的父类和子类,实际上是结构体类型的强制转换,最近看Linux内核源码时经常接触到这种方法,在这里就当作是一个简单的学习吧. 下面给出一个Demo,很简单,分别定义了一个fat ...
- 设置KAFKA
让我们继续下载并设置Kafka,启动zookeeper,集群,生产者和消费者. 要下载Kafka,请参阅此链接 http://kafka.apache.org/downloads.html 下载 ...
- Rdlc Mail Label
1.创建报表服务器项目RDLML. 2.新建共享数据源DataMailLabel,设置到数据库AdventureWorks的连接,并为报表指定相应的访问凭据. 3.选择Name.Color.Thumb ...
- ES7.3.0配置
# elasticsearch.yml cluster.name: my-application node.name: node-1 node.master: true node.ingest: tr ...
- C# 填充客户端提交的值到T对象
/// <summary> /// 填充客户端提交的值到 T 对象 如appinfo = AppConvert.To<Appinfo>(context.Reques ...
- springMVC 任意文件读取相关路径
在做检查的时候,发现一个路径是可以去读取文件的,但是平时的/etc/目录下都无法读取到,只能先读取web目录下的文件尝试. 因为知道是springMVC框架,所以可以先尝试该路径 ../../WEB- ...
- MySQL之查询篇(三)
一:查询 1.创建数据库,数据表 -- 创建数据库 create database python_test_1 charset=utf8; -- 使用数据库 use python_test_1; -- ...
- Django--一对多表操作
目录 Django--一对多表操作 需求 步骤 添加路由映射关系 学生表的增删改查 ajax更新和添加 Django--一对多表操作 今天还以一个学生管理系统为例,先通过pymysql这个模块,进行一 ...
- web基础运用
目录 web框架 web应用本质 Web应用程序的优点 Web应用程序的缺点 BS架构优点 web框架的分类 web框架包含了三部分 web框架分类 Http协议 路由系统 自定制的web框架案例 w ...