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 ...
随机推荐
- kali渗透
局域网-断网&劫持(kali) 1.查看局域网中的主机 fping –asg 192.168.1.0/24 2.断网 arpspoof -i wlan0 -t 192.168.100 19 ...
- ps 简单使用 ----- 将图片静态图片制作成动图
1. 准备好你需要静态图片 放到文件夹中 2.打开ps 软件 将右上角切换为 动感 3.观察下方时间轴 点击加号 将图片导入 按住shift 选择图片 4.切换为帧格式 选择循环 ...
- 【Appium + Python + WebviewH5】之微信小程序自动化测试
进行调试,打开X5: http://debugmm.qq.com/?forcex5=true http://debugx5.qq.com http://debugtbs.qq.com 一般前两个就可以 ...
- Sitecore安全性第1部分:自定义角色和权限
安全性是任何Sitecore构建的重要组成部分.它可确保您的内容作者具有适当级别的访问权限,以管理他们拥有的内容,并授予他们访问不同Sitecore功能的权限. Sitecore附带了许多提供功能访问 ...
- 【数据结构与算法】线性表操作(C++)
#include <stdio.h> #define maxSize 100 //定义整型常量maxSize值为100 /*顺序表的结构体定义*/ typedef struct SqLis ...
- 使用 Navicat Premium 将 sql server 的数据库迁移到 mysql 的数据库中
步骤1,打开 Navicat Premium ,创建一个新的 mysql 数据库: 步骤2,选中刚刚创建的新数据库 ,双击选中后点击导入向导,然后选择 "ODBC",并点击下一步 ...
- Unity AsyncGPUReadback 接口测试
Unity2018新加入了该接口,可以做到异步RenderTexture->像素数据和异步的ComputeBuffer.GetData 那么写了几个例子来测试下. 1.RenderTexture ...
- 物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus
物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus 物联网 (IoT) 不只是新技术,还是与旧技术的集成,其关键在于通信.可用的通信方法各不相同,但是,各种不同的协议在将海量“事物”连接 ...
- HTML5深入学习之鼠标跟随,拖拽事件
知识点(鼠标跟随): mousedown: 当用户用鼠标点击在某一元素上就会触发该事件 mouseover: 当鼠标指针在某一元素上移动就会触发改事件 下面这个例子的效果就是鼠标点击元素后,元素跟着 ...
- 关于ionic2在IOS上点击延迟的问题
正常的点击事件, 不知道 为什么 ,在IOS上明显会延迟几百毫秒.. 加上tappable属性就可以解决了 <div tappable (click)="doClick()" ...