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存储过程和存储函数&触发器的更多相关文章

  1. oracle存储过程和存储函数

    存储过程 1.存储过程简介 下面先来简单介绍一下oracle的存储过程的语法,如下: create or replace procedure Tony_Process ( num in number, ...

  2. Oracle 存储过程以及存储函数

    以下的一些例子是基于scott用户下的emp表的数据,一和二使用的均为in,out参数,最后一个综合练习使用了 in out参数 一.存储过程 1.创建无参的存储过程示例  ------ hello ...

  3. oracle存储过程与存储函数的区别和联系

    相同点:1.创建语法结构相似,都可以携带多个传入参数和传出参数.      2.都是一次编译,多次执行. 不同点:1.存储过程定义关键字用procedure,函数定义用function. 2.存储过程 ...

  4. Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么 ...

  5. Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器

    ---视图 ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中. ---一个由查询语句定义的虚拟表. ---查询语句创建表 create table emp a ...

  6. 编程开发之--Oracle数据库--存储过程和存储函数(2)

    上一小结我们简单介绍了存储过程和存储函数,对存储过程和存储函数有了一个基本的了解,接下来介绍在java程序中如何调用我们创建的存储过程和存储函数 1.在应用程序中调用我们的存储过程 创建一个简单的Ja ...

  7. 存储过程,存储函数(Oracle)

    存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 存储过程和存储函数的区别? 存储函数:可以通过return 语句返回函数值. 存储过程:不能 除此之外我们可以认为 ...

  8. 编程开发之--Oracle数据库--存储过程和存储函数(1)

    1.存储过程和存储函数 描述:指存储在数据库中供所有用户程序调用的子程序叫做存储过程.存储函数 区别:存储函数可以通过return子句返回一个函数的值 (1)存储过程 语法:create [or re ...

  9. mysql 存储过程和存储函数

    14.1.1 创建存储过程 MySQL中,创建存储过程的基本形式如下: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristi ...

随机推荐

  1. C# 对结构体和指针的使用

    //结构体的定义 [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]        pub ...

  2. ThreadPoolExecutor 几个疑惑与解答

    任务是否都要先放入队列? 当工作线程数小于核心线程数时,任务是不会经过队列,而是直接创建 Worker 时传入.但是如果工作线程数已经大于核心线程数,则任务是要先放入队列的.实际上只要是被创建的工作线 ...

  3. 游戏 & Github Page

    1. snakewizard.github.io 贪吃蛇小游戏 2. mattbasile.github.io 龙珠 DragonballZ-Battle 3. nathandhyou.github. ...

  4. 田螺便利店—filezilla实现Linux和windows通信(二)

    filezilla,FileZilla是一个免费开源的FTP软件,分为客户端版本和服务器版本,具备所有的FTP软件功能.可控性.有条理的界面和管理多站点的简化方式使得Filezilla客户端版成为一个 ...

  5. 遇到短信轰炸,别人换ip调你的短信接口怎么办

    前端开发者很容易暴露自己的请求地址和参数,我们都知道,一个h5页面,按 F12 是可以看到页面的源码的,所以经常很多人会利用这一点恶意调取别人的接口. 我们公司出现了好多次短信接口被大量调用,导致一天 ...

  6. 解题报告 『[USACO08NOV]Mixed Up Cows(状压动规)』

    原题地址 观察数据范围:4 ≤ N ≤ 16. 很明显,这是一道状压DP. 定义:dp[i][j]表示队尾为奶牛i,当前含奶牛的状态为j,共有多少组符合条件的队伍. 代码实现如下: #include ...

  7. Web前端学习第二天(cookie 一)

    CookIe安全 cookie一个神奇的机制,无论什么请求中都会带有cookie字段. 可以通过服务器响应头的Set-Cookie字段添加,修改和删除,大多数情况下,客户端通过JavaScript也可 ...

  8. 手机游戏引擎 Cocos

    Cocos是全球最受欢迎的移动游戏开发解决方案,整合了Cocos 2d-x.Cocos 2d-js.Cocos Studio.Cocos Code IDE等框架及工具,无论您是开发新手还是行业资深人士 ...

  9. js入门 关于js属性及其数据类型(详解)

    1. js的本质就是处理数据.数据来自于后台的数据库. 所以变量就起到一个临时存储数据的作用. ECMAScript制定了js的数据类型. 数据类型有哪些? 1. 字符串   String 2. 数字 ...

  10. TensorFlow机器学习实战指南之第二章

    一.计算图中的操作 在这个例子中,我们将结合前面所学的知识,传入一个列表到计算图中的操作,并打印返回值: 声明张量和占位符.这里,创建一个numpy数组,传入计算图操作: import tensorf ...