文章思维导图

一. 存储过程和存储函数的定义

定义:存储在数据库中,供所有用户程序调用的子程序叫做存储过程/存储函数。复杂点的解释:存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL 语句集,该SQL语句集经过编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数来调用并执行它,从而完成一个或一系列的数据库操作。

区别:是否可以通过return返回函数值。

存储函数可以通过return返回函数值;而存储过程不可以。

注意:由于通过out参数,存储过程也可以返回函数值,所以存储过程和存储函数已经没有太大的区别了。而存储函数仍然存在,是由于oracle不断升级,需要实现向下兼容,所以存储函数就一直存留着。

二. 存储过程

1. 创建和使用存储过程

用create procedure命令建立存储过程,语法如下:

create [or replace] procedure 过程名(参数列表)

as -- as不可以省略

PLSQL子程序体;

注意事项:

1> 存储过程或者存储函数,只能创建或者替换。

2> 参数可以带也可以不带。

3> as相当于PLSQL语句中的declare,用来声明变量、游标等,但是不可以省略。

2. 入门案例:

(1)不带参数的存储过程:不用带括号

create or replace procedure sayHello

as

begin

dbms_output.put_line('HelloWorld');

end;

/

调用方式:

<1> 使用execute:

exec是sqlplus命令,只能在sqlplus中使用,使用时,exec可以直接跟过程名(可以省略括号);

控制台执行示例:

SQL> set serveroutput on;

SQL> exec sayHello;

<2> 使用call:

使用call时,要带上括号;call为SQL命令使用时,对场景没有限制。

控制台执行示例:

SQL> set serveroutput on;

SQL> call sayHello();

<3> 使用PLSQL语句调用:

控制台执行示例:

SQL> set serveroutput on;

SQL> begin

sayHello;

end;

/

(2)带参数的存储过程:

给指定的员工涨100元工资,并且打印涨前和涨后的薪水:

create or replace procedure addSal(pempno in emp.empno%type)

as

pename emp.ename%type;

beforesal emp.sal%type;

aftersal emp.sal%type;

begin

select ename,sal into pename,beforesal from emp where empno=pempno;

aftersal:=beforesal+100;

update emp set sal=aftersal where empno=pempno;

dbms_output.put_line('姓名: '||pename||' 涨前工资:'||beforesal||'涨后工资:'||aftersal);

end;

/

执行代码截图

** 注意事项:**

<1> 要说明,参数是输入参数(in)还是输出参数(out);

<2> 为保证调用多个存储过程中处在同一个事务中,所以一般不在存储过程或者存储函数中,commit或rollback;

3. 调试存储过程:

SQL Developer 调试存储过程

** 注意事项:**

(1) oracle数据库和PLSQL工具都是放在同一个机器上;

(2) 在开启调试时,可能会报出权限不够的错误信息,通过下面方式进行授权:

授权

三. 存储函数

1. 存储函数:

函数(Function)为一命名的存储程序,可带参数,并返回一计算值.

函数和过程的结构类似,但必须有一个return子句,用于返回函数值.

2. 创建存储函数的语法:

create [or replace] function 函数名(参数列表)

return 函数值类型

as

PLSQL子程序体;

注意事项:

(1) 与存储过程注意事项类似,不同的是,必须有个返回值;

(2) 参数列表可以有,也可以没有.当没有时,函数名后面不要带括号.

create or replace function queryempannal(pempno in number)

return number

as

psal emp.sal%type;

pcomm emp.comm%type;

begin

select sal,comm into psal,pcomm from emp where empno=pempno;

return psal*12+nvl(pcomm,0);

end;

四. in和out参数

1.概述

(1) 一般来讲,存储过程和存储函数的区别在于存储函数可以有一个返回值;而存储过程没有返回值.

(2) 过程和函数都可以通过out指定一个或多个输出参数.我们可以利用out参数,在过程和函数中实现返回多个值.

a. 存储过程和存储函数都可以有out参数;

b. 存储过程和存储函数都可以有多个out参数;

c. 存储过程可以通过out参数来实现返回值;

(3) 什么时候用存储过程/存储函数?

原则:如果只有一个返回值,用存储函数;否则,就用存储过程.

create or replace procedure queryempinform(eno in number,

pename out varchar2,

psal out number,

pjob out varchar2 )

as

begin

select ename,sal,job into pename,psal,pjob from emp where empno=eno;

end;

/

oracle存储过程与函数的区别及作用,Oracle存储过程与存储函数-入门相关推荐

  1. puts和fputs函数及其区别,C语言puts和fputs函数详解

    puts和fputs函数及其区别,C语言puts和fputs函数详解 与 gets 函数一样,对于 puts 函数,同样建议使用 fputs 函数来代替 puts 函数.如下面的示例代码所示: int ...

  2. gets和fgets函数及其区别,C语言gets和fgets函数详解

    gets和fgets函数及其区别,C语言gets和fgets函数详解 每当讨论 gets 函数时,大家不由自主地就会想起 1988 年的"互联网蠕虫",它在 UNIX 操作系统的 ...

  3. oracle 和mysql有什么区别_mysql和oracle的区别有哪些

    原标题:mysql和oracle的区别有哪些 MySQL和Oracle都是流行的关系数据库管理系统(RDBMS),在世界各地广泛使用:大多数数据库以类似的方式工作,但MySQL和Oracle的这里和那 ...

  4. c语言中gets与fgets,gets和fgets函数及其区别,C语言gets和fgets函数详解

    每当讨论 gets 函数时,大家不由自主地就会想起 1988 年的"互联网蠕虫",它在 UNIX 操作系统的 finger 后台程序中使用一个 gets 调用作为它的攻击方式之一. ...

  5. mysql创建有参数的函数,使用动态数量的参数创建MySQL存储函数

    我正在尝试创建一个MySQL函数IS_IN_ENUM('value','val1′,'val2′,'val3′),如果'value'在('val1′,'val2′,'val3')中,则返回true.我 ...

  6. oracle数据库跟mysql的区别_关于Oracle数据库与MySQL数据库的几点区别

    Oracle数据库与MySQL数据库的区别是本文我们主要要介绍的内容,接下来我们就开始介绍这部分内容,希望能够对您有所帮助. Oracle与MySQL的区别: 1.在Oracle中用select * ...

  7. 友元函数、类的非静态成员函数、静态成员函数的区别

    类中申明的函数相对于类来说有三层意思: 1.有this指针 2.函数在类的作用区域中 3.可以访问类中私有部分 4.可以被继承 非静态成员函数具有1234 静态成员函数具有234 友元函数具有3 静态 ...

  8. oracle 创建,删除存储过程,参数传递,创建,删除存储函数,存储过程和函数的查看,包,系统包

    认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命 ...

  9. SQL中CharIndex函数、InStr 函数、PatIndex函数、Stuff函数区别与作用

    在c#中可以用字符串的IndexOf方法来判断一个字符串中是否含有指定的字符.而在SQL SERVER中也就相关的函数来实现IndexOf的功能.CharIndex,InStr,PatIndex三个函 ...

最新文章

  1. eclipse配置struts.xml自动提示
  2. 「转型新范式」第四范式2021发布会全程直播倒计时
  3. vue tag=“li“ 和event原有样式渲染不出来
  4. C# 获取文件大小,创建时间,文件信息,FileInfo类的属性表
  5. 从底部上滑失灵_宝鸡终于也有超火的高空玻璃水滑啦!就在玉池公社!8月10日见~...
  6. Microsoft Dynamics CRM 2015 之安装SQL Server 2012过程中出现“启用windows功能NetFx3时出错...
  7. 在html页面中加入矢量图,在html中引用矢量图
  8. matlab中gain是什么,PID调理中的GAIN是啥意思?
  9. iphone老是显示e服务器,苹果手机变成e网怎么办(苹果手机上显示e,怎么回事?)
  10. matlab 帕多瓦数列 通项公式_matlab通分.ppt
  11. 图书信息管理系统C语言IPO,基于IPO的Python教学设计
  12. 关闭和开启笔记本自带键盘。
  13. 小程序模板网站平台_小程序模板平台哪个好
  14. CSS3 弹性布局/伸缩布局 flex
  15. 彻底搞懂 字符 编码 GBK 和 UTF8
  16. 字符设备驱动开发流程
  17. ASLR(地址空间随机化)
  18. open-set recognition(OSR)开集识别的一些思考(二)
  19. ts从入门到进阶—3-4var/let/const声明,解构,展开
  20. 腿式机器人激光SLAM系统

热门文章

  1. vscode 智能打印_vscode智能提示
  2. 【自适应盲均衡9】基于判决反馈的多径衰落信道的盲均衡与MATLAB仿真(CMA-DFE)
  3. 【强化学习】PPO代码注释版本
  4. c语言自动计算时间,C语言 · 计算时间
  5. 密钥文件登录服务器,密钥文件登录云服务器
  6. NOIP模拟测试8「寿司」
  7. 2018/7/31 -zznu-oj -问题 C: 磨刀- 【扩展欧几里得算法的基本应用】
  8. oracle 闪回操作(flashback)
  9. Java回调机制解读
  10. java和jvm_java 和 JVM