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 ...
随机推荐
- mke2fs和mkfs命令使用
1.mke2fs命令 在Linux系统下,mke2fs命令可用于创建磁盘分区上的”ext2/ext3”文件系统. (1)语法 mke2fs(选项)(参数) (2)常用选项 -b<区块大小> ...
- 正则表达式之re模块
re模块一.什么是正则表达式与re模块?1.1 字符组1.2 元字符1.2.1 单个使用1.2.2 组合使用二.为什么要使用正则三.如何使用3.1 re模块的三种比较重要的方法3.1.1 findal ...
- thinkphp 6.0 swoole扩展websocket使用教程
前言 ThinkPHP即将迎来最新版本6.0,针对目前越来越流行Swoole,thinkphp也推出了最新的扩展think-swoole 3.0. 介绍 即将推出的tp6.0,已经适配swoole.并 ...
- 第二节:EF Core的常规“增删改”及状态的变化
一. 整体说明 1. 本节用到的表 2. 状态说明补充 ①.Detached: 游离的状态,与数据库没有什么交涉,比如新new一个实体,状态就是Detached. ②.Added: 增加的状态. ③. ...
- Java 在 Word 文档中使用新文本替换指定文本
创作一份文案,经常会高频率地使用某些词汇,如地名.人名.人物职位等,若表述有误,就需要整体撤换.文本将介绍如何使用Spire.Doc for Java,在Java程序中对Word文档中的指定文本进行替 ...
- LuoguP3069 【[USACO13JAN]牛的阵容Cow Lineup
题目链接 看了看其他大佬的文章,为什么要控制右端呢 其实就是一个很简单的模拟队列趴... 难点就在于根据题意我们可以分析得一段合法区间内,不同种类个数不能超过k+2 哦当然,由于种类数范围过大,要对种 ...
- kubectl 创建 Pod 背后到底发生了什么?
原文链接:kubectl 创建 Pod 背后到底发生了什么? 想象一下,如果我想将 nginx 部署到 Kubernetes 集群,我可能会在终端中输入类似这样的命令: $ kubectl run - ...
- ML学习笔记之Anaconda中命令形式安装XGBoost(pip install)
0x00 概述 在没有安装XGBoost之前,import xgboot会出错,如下: # ModuleNotFoundError: No module named ‘xgboost’ 0x01 安装 ...
- c# 基本类型存储方式的研究
基本单位 二进制,当前的计算机系统使用的基本上是二进制系统.二进制的单位是位,每一位可以表示2个数: 0或1.byte(字节) 有8位,可以表示的数为2的8次方,即256个数,范围为[0-255]. ...
- asp.net core MVC 过滤器之ExceptionFilter过滤器(一)
简介 异常过滤器,顾名思义,就是当程序发生异常时所使用的过滤器.用于在系统出现未捕获异常时的处理. 实现一个自定义异常过滤器 自定义一个异常过滤器需要实现IExceptionFilter接口 publ ...