oracle存储过程和存储函数&触发器
oracle存储过程和存储函数
指存储在数据库中供所有用户程序调用的子程序叫存储过程,存储函数
存储过程和存储函数的相同点:完成特定功能的程序
存储过程和存储函数的区别:是否用return语句返回值
=========================创建和使用存储过程=============================
用create procedure命令建立存储过程和存储函数
语法:
create [or replace] procedure 过程名(参数列表)
as
PLSQL子程序体;
实例:带参数的存储函数
create or replace procedure RaiseSalry(eno in number)
as
psal emp.sal%type;
begin
select sal into psal from emp where EMPNO=eno;
update emp set sal = sal +100 where EMPNO=eno;
DBMS_OUTPUT.PUT_LINE('涨工资前的薪水'||psal||'涨工资后的薪水'||(psal+100));
end;
/
===========================创建存储函数的语法============================
create [or replace] function 函数名(参数列表)
return 函数值类型
as
plsql子程序体;
实例:查询某个员工的年收入
create or replace function queryempincome(eno in number)
return number
as
--定义变量保存员工薪水和奖金
psal emp.sal%type;
pcomm emp.comm%type;
begin
--得到员工的月薪和奖金
select sal,comm into psal,pcomm from emp where empno=eno;
--直接返回年收入
return psal*12+pcomm;
end;
/
===========================in和out参数=============================
过程和函数可以通过out指定一个或多个输出参数,我们可以利用out参数,在过程和函数中实现多个返回值
原则:如果只有一个返回值,就用存储函数,否则,就用存储过程
实例:out参数,查询员工姓名,月薪和职位
create or replace procedure queryempinform(eno in number,
pname out varchar2,
psal out number,
pjob out varchar2)
as
begin
--得到该员工的姓名,月薪和职位
select ename,sal,ejob into pname,psal,pjob from emp where empno=eno;
end;
/
==========================在out参数中使用光标=========================
案例:查询某个部门中所有员工的所有信息
--包头:声明
create or replace package mypackage as
type empcursor is ref cursor;
procedure queryEmpList(dno in number,empList out empcursor);
end mypackage;
--包体:实现包头声明的所有方法
create or replace package body mypackage as
procedure queryEmpList(dno in number,empList out empcursor)
as
begin
open empList for select * from emp where deptno=dno;
end queryEmpList;
end mypackage;
oracle触发器
========================什么是触发器(trigger)==========================
①数据库触发器是一个与表相关联的,存储的pl/sql程序
②没当一个特定的数据操作语句(insert,update,delete)在指定的表上发出时,oracle自动的执行触发器中定义的语句序列
如何创建触发器
create trigger saynewemp
after insert
on emp
declare
begin
dbms_output.put_line('成功插入新员工');
end;
/
============================触发器应用场景==============================
1.复杂的安全性检查
2.数据确认
3.实现审计功能
4.完成数据的备份和同步
==============================触发器的语法==============================
创建触发器的语法
create [or replace] trigger 触发器名
{before|after}
{delete|insert|update[of 列名]}
on 表名
[for each row [when(条件)]]
plsql块
==============================触发器的类型==============================
语句级触发器:在指定的操作语句之前或之后执行一次,不管这条语句影响了多少行
行级触发器:触发语句作用的每一条记录都被触发。在行级触发器中使用:old和:new伪记录变量,识别值得状态
=================================案例=================================
触发器应用场景一:实施复杂的安全性检查
禁止在非工作时间插入新员工
1,周末:to_char(sysdate,'day')in('星期六','星期日')
2,上班前,下班后:to_number(to_char(sysdate,'hh24')) not between 9 and 18
create or replace trigger securityemp
before insert
on emp
begin
if to_char(sysdate,'day')in('星期六','星期日') or
to_number(to_char(sysdate,'hh24')) not between 9 and 18 then
--禁止insert新员工
raise_application_error(-20001,'禁止在非工作时间插入新员工');
end if;
end;
/
触发器应用场景二:数据的确认
涨工资不能越涨越少
create or replace trigger checksalary
before update
on emp
for each row
begin
if :new.sal<:old.sal then
raise_application_error(-20002,'涨后的薪水不能少于涨前的薪水,涨后的薪水:'||:new.sal||'涨前的薪水'||:old.sal);
end if;
end;
/ 触发器应用场景三:数据库审计
创建基于值的触发器
给员工涨工资,当涨后的薪水超过6000,审计该员工的信息
创建表用于保存审计信息
create table audit_info
(
information varchar2(200)
);
create or replace trigger do_audit_emp_salary
after update
on emp
for each row
begin
--当涨后的薪水大于5000,插入审计信息
if :new.sal>5000 then
insert into audit_info values(:new.empno||' '||new.ename||'
'||:new.sal);
end if;
end;
/
触发器应用场景四:数据的备份和同步
利用触发器实现数据的同步部分(分布式数据库)
当给员工涨工资后自动备份到备份表中
create or replace trigger sync_salary
after update
on emp
for each row
begin
--当主表更新后,自动更新备份表
update emp_back set sal=:new.sal where empno=:new.empno;
end;
/
oracle存储过程和存储函数&触发器的更多相关文章
- oracle存储过程和存储函数
存储过程 1.存储过程简介 下面先来简单介绍一下oracle的存储过程的语法,如下: create or replace procedure Tony_Process ( num in number, ...
- Oracle 存储过程以及存储函数
以下的一些例子是基于scott用户下的emp表的数据,一和二使用的均为in,out参数,最后一个综合练习使用了 in out参数 一.存储过程 1.创建无参的存储过程示例 ------ hello ...
- oracle存储过程与存储函数的区别和联系
相同点:1.创建语法结构相似,都可以携带多个传入参数和传出参数. 2.都是一次编译,多次执行. 不同点:1.存储过程定义关键字用procedure,函数定义用function. 2.存储过程 ...
- Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象
作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么 ...
- Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
---视图 ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中. ---一个由查询语句定义的虚拟表. ---查询语句创建表 create table emp a ...
- 编程开发之--Oracle数据库--存储过程和存储函数(2)
上一小结我们简单介绍了存储过程和存储函数,对存储过程和存储函数有了一个基本的了解,接下来介绍在java程序中如何调用我们创建的存储过程和存储函数 1.在应用程序中调用我们的存储过程 创建一个简单的Ja ...
- 存储过程,存储函数(Oracle)
存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 存储过程和存储函数的区别? 存储函数:可以通过return 语句返回函数值. 存储过程:不能 除此之外我们可以认为 ...
- 编程开发之--Oracle数据库--存储过程和存储函数(1)
1.存储过程和存储函数 描述:指存储在数据库中供所有用户程序调用的子程序叫做存储过程.存储函数 区别:存储函数可以通过return子句返回一个函数的值 (1)存储过程 语法:create [or re ...
- mysql 存储过程和存储函数
14.1.1 创建存储过程 MySQL中,创建存储过程的基本形式如下: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristi ...
随机推荐
- vim 加密(crypt)文本文档
算法 vim7.3版本支持两种加密方式——PKzip算法(已知有缺陷的).Blowfish算法(从7.3版本开始支持).Blowfish2算法(从7.4.399版本开始支持)而vim -x 默认采用P ...
- 在c#中 RemoveAt、 Remove、delete用法区别
有三种方法可以删除 DataTable 中的 DataRow: Delete 方法和 Remove 方法和 RemoveAt 方法 其区别是: Delete 方法实际上不是从 DataTable 中删 ...
- 浅谈get,post,put和delete请求
get.put.post.delete含义与区别 1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数据,不会影 ...
- sping配置头文件
spring配置文件头部xmlns配置精髓 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <beans xmlns="http://www.s ...
- 前段时间碰到的一些问题(免费WiFi设置+fiddler对手机进行抓包+fiddler抓不到https的请求)
这段时间转入移动端测试,对这块比较陌生,工作开展起来比较困难,所以好多东西都只是以解决问题为第一目标,没有去细细推敲其中原理,可能会有些语无伦次之感,但还是记一下当时解决问题的大致思路,供以后参考. ...
- Linux搜索文件或内容
1.递归搜索文件内容,如果查找"hello,world!"字符串,可以这样: grep -rn "hello,world!" * * : 表示当前目录所有文件, ...
- ubuntu18安装navicat
1.登陆 http://www.navicat.com.cn/download/navicat-for-mysql 页面下载navicat安装包,务必选位置1-64bit ps: 中文版乱码问题严重, ...
- Spark开发环境搭建(IDEA、Scala、SVN、SBT)
软件版本 软件信息 软件名称 版本 下载地址 备注 Java 1.8 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-dow ...
- python,验证码生成
<pre>import string import random from PIL import Image from PIL import ImageDraw from PIL impo ...
- 使用nginx mirror 制作nexus 的简单ha
主要是运行两台nexus 机器,通过nexus 的host 以及proxy 以及public 模型,结合nginx 的mirror 将对于host 的get 请求 mirror 到另一台机器pro ...