Oracle中的存储过程【Stored Procedure】和存储函数【Stored Function】

article/2025/8/27 2:48:32

一、存储过程

1.1、存储过程的介绍

    存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后直接存储在数据库中,用户调用指定存储过程的名字和传递对应的参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都具备存储过程。

1.2、存储过程的优点和不足

存储过程(Stored Produce)的优点
序号存储过程【Stored Produce】的优点
1存储过程可以使得程序执行效率更高、安全性更好,因为过程建立保存之后就是已经编译并且储存到数据库中的,而直接编写sql语句则需要先通过分析器解析后再执行因此过程效率更高,并且直接编写写sql语句可能会带来一些安全性问题,如:sql注入 等
2建立存储过程对系统资源的消耗不大(这是因为存储过程只有在调用时才会执行)
3存储过程可以用于降低网络流量(这是因为存储过程的代码是直接存储在数据库本地,直接调用就行,而不用编写大量的sql语句的代码)
4存储过程使您能够增强对执行计划的重复使用
5可维护性高(这是因为更新存储过程通常比更改、测试以及重新部署程序集花费更少的时间和精力)
6代码精简一致(一个存储过程可以用于应用程序代码的不同位置)
7

增强安全性

①通过向用户授予对存储过程(而不是基于表)的访问权限,它们可以提供对特定数据的访问;

②提高代码安全,防止 SQL注入;

③SqlParameter 类指定存储过程参数的数据类型,作为深层次防御性策略的一部分,可以验证用户提供的值类型)

存储过程(Stored Produce)的不足
序号存储过程【Stored Produce】的不足
1大量的使用存储过程,会对服务器造成很大的压力

1.3、存储过程的创建语法

参数的3种类型
序号    参数类型说明
1IN 是参数的默认模式,这种模式就是在程序运行的时候已经具有值,在程序体中值不会改变
2OUT 模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程
3IN OUT 表示该参数可以向该过程中传递值,也可以将某个值传出去
//基础语法
create [or replace] procedure 存储过程名称
(参数名  in|out 参数类型,参数名  in|out 参数类型) is|as- - 变量声明部分begin- - 业务逻辑部分end;//详细语法内容
create [or replace] procedure 存储过程名称
(param1 in type,param2 out type) is|as变量1 类型(值范围);变量2 类型(值范围);beginselect count(*) into 变量1 from 表A where列名=param1;if (判断条件) thenselect 列名 into 变量2 from 表A where列名=param1;dbms_output.Put_line('打印信息');elsif (判断条件) thendbms_output.Put_line('打印信息');elseraise 异常名(NO_DATA_FOUND);end if;
exceptionwhen others thenrollback;
end;

1.4、执行存储过程的语法

 方法一:

//执行存储过程语法1
CALL 存储过程名称(参数1,参数2);//执行存储过程示例
CALL CACULATESALARY(1,5000);

方法二:

//执行存储过程语法2
BEGIN
存储过程名称(参数1,参数2);
END;//执行存储过程示例
BEGIN
caculatesalary(1,5000);
END;

1.5、存储过程的示例

    示例1:实现输入雇员的编号和涨薪资的数额先是查看原薪资;然后是更新该雇员的薪资,然后打印出来查看;最后如果更新失败则需要回滚。

表的内容如下:

 

 存储过程如下:

CREATE OR REPLACE PROCEDURE CaculateSalary 
(peopleNumber in NUMBER,needIncreaseSalaryNumber in NUMBER)
ASTotalSalary NUMBER:=0;BEGIN--获取到当前的工资SELECT SALARY INTO TotalSalary from PEOPLE WHERE PEOPLE.ID=peopleNumber;--输出张薪资前的工资dbms_output.put_line('涨薪前工资是:'||TotalSalary);--涨工资后的工资UPDATE PEOPLE SET SALARY=(TotalSalary+needIncreaseSalaryNumber) WHERE ID=peopleNumber;--输出张薪资后的工资dbms_output.put_line('涨薪后工资是:'||(TotalSalary+needIncreaseSalaryNumber));--提交事务commit;--异常则回滚EXCEPTIONWHEN OTHERS THENrollback;dbms_output.put_line('涨薪异常执行回滚操作');
END;

 

 示例2:想要传入参数,然后又通过该参数传递内容出去

CREATE OR REPLACE procedure testInuptOutput
(message in out varchar2)
--当既想携带值进来,又想携带值出去,可以用in out
asbegindbms_output.put_line('当前输入的内容为:'||message); --输出的为携带进来的值message:='我是经过处理后的值'||998;
end;

 

二、存储函数

2.1、存储函数介绍

    存储函数(Stored Function)是创建之后保存在数据库中,且封装在oracle服务器中的一段已经完成的plsql代码片段。

2.2、存储函数的特点

存储函数(Stored Function)的特点
序号存储函数的特点

1

在数据库启动时自动加载
2函数没有参数输入输出之分
3函数必须有返回值
4调用函数时必须使用它的返回值
5存储函数即可以在sql 语句中使用,也可以在plsql中使用

2.3、存储函数的创建语法

参数的3种类型
序号    参数类型说明
1IN 是参数的默认模式,这种模式就是在程序运行的时候已经具有值,在程序体中值不会改变
2OUT 模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程
3IN OUT 表示该参数可以向该过程中传递值,也可以将某个值传出去
//存储函数的基础语法
create [for replace] function 存储函数的名称(参数名 in|out 参数类型,参数名 in|out 参数类型)return 参数类型is | asbeginend;//存储函数的详细语法
Create [or replace] function 函数名称(参数名称 in|out 参数类型,参数名称 in|out 参数类型,...)Return 结果变量数据类型Is | as变量声明部分;Begin逻辑部分;Return 结果变量;[exception 异常处理部分]End;注意:end后面的;不能取消掉。参数列表里面默认是输入类型 in

2.4、执行存储函数的语法

//执行存储函数方法1(放在表达式中)SELECT 函数名称(参数)  FROM dual;//执行存储函数方法1示例
SELECT TIMEGROUP(TO_DATE('2022-02-12 17:30:36', 'yyyy-MM-dd hh24:mi:ss'))handleTime FROM dual;
//执行存储函数方法2declare 变量名称 类型;begin--赋值存储函数结果给变量变量名称:=存储函数名称--打印变量结果dbms_output.put_line(变量名称);end;//执行存储方法2示例
declare result varchar(16);beginresult:= TIMEGROUP(TO_DATE('2022-02-12 17:30:36', 'yyyy-MM-dd hh24:mi:ss'));dbms_output.put_line(result);end;

2.5、存储函数示例

示例:实现对日期分组(即:以半小时开始间隔一个小时的为一组

①【比如:2022-02-13 07:30:00一直到2022-02-13 08:29:59】的归为2022-02-13 08:30:00

②【比如:2022-02-13 08:30:00一直到2022-02-13 09:29:59】的归为2022-02-13 09:30:00)

存储函数如下:

CREATE OR REPLACE FUNCTION TimeGroup(inputDate IN DATE) RETURN VARCHAR2
AS
result VARCHAR(16):='';
input_yyyy_MM_dd_hh24 VARCHAR(13):=to_char(inputDate,'yyyy-MM-dd hh24');
tmp_timegroup DATE:=TO_DATE(input_yyyy_MM_dd_hh24||'30:00','yyyy-MM-dd hh24:mi:ss');BEGINIF inputDate>=tmp_timegroup THEN result:=SUBSTR(TO_CHAR((tmp_timegroup+1/24),'yyyy-MM-dd hh24:mi:ss'),0,16);ELSE result:=SUBSTR(TO_CHAR((tmp_timegroup),'yyyy-MM-dd hh24:mi:ss'),0,16);END IF;RETURN result;
END;

 三、存储过程和存储函数的相同点和区别

存储过程和存储函数的相同点
序号存储过程和存储函数的相同点
1创建语法结构相似,都可以携带多个传入参数和传出参数
2都是一次编译,多次运行
3都可以使用【in/ out /in out】三种模式的参数
存储过程和存储函数的区别
存储过程存储函数
用于在数据库中完成特定的操作(或任务)【过程一般会被设计成求若干个运算结果,完成一系列的数据处理,或与计算无关的各种操作】(比如:插入、更新、删除等操作)用于特定的数据操作【只为求得一个值】(比如:归类、分组)
程序头部使用【Procedure】声明程序头部使用【Function】声明
程序头部声明时不需要任何返回类型程序头部申明时必须描述返回类型,并且必须在PL/SQL块中包含一个有效的return语句
可以作为一个独立的PL/SQL语句来执行不能够独立执行,必须作为表达式的一部分调用
可以通过out /in out 返回零个或多个值

①通过return语句返回一个值,且该返回值需要与声明的内容一致;

②也可以通过out类型的参数带出变量

SQL语句(DML或SELECT)中不可调用存储过程SQL语句(DML或SELECT)中可调用存储函数

四、其他资料

在开发过程中为什么需要写存储过程 - 肥宅兜 - 博客园 (cnblogs.com)icon-default.png?t=M0H8https://www.cnblogs.com/doudouxiaoye/p/5804467.html存储过程这一篇就够了 - 知乎 (zhihu.com)icon-default.png?t=M0H8https://zhuanlan.zhihu.com/p/137896709
Oracle存储过程和自定义函数 - 云+社区 - 腾讯云 (tencent.com)icon-default.png?t=M0H8https://cloud.tencent.com/developer/article/1861667

oracle存储过程(一):简单入门 - i孤独行者 - 博客园 (cnblogs.com)icon-default.png?t=M0H8https://www.cnblogs.com/dc-earl/articles/9260111.html Oracle的存储过程基本写法 - 屢敗屢戰 - 博客园 (cnblogs.com)icon-default.png?t=M0H8https://www.cnblogs.com/joeyJss/p/11458653.html

Oracle高级plsql中的储存过程和储存函数 (daimajiaoliu.com)icon-default.png?t=M0H8https://www.daimajiaoliu.com/daima/479c5f2db100403 


http://chatgpt.dhexx.cn/article/WRb5kAbq.shtml

相关文章

DVWA指点迷津-XSS(Stored)

XSS(Stored) 特点 又名“存储型XSS”。攻击者的“恶意语句”会存储在服务器端数据库,具有很强的稳定性。每次前端调用数据库内容,则会触发语句。一般出现在留言板、上传资料等与数据库有交互的模块。相比反射型XSS,该类型的XSS带来的危害更…

XSS(Stored)

XSS(Stored) 前言 看了一个web的安全视频,里面有说说有的web漏洞都是输入输出的控制问题,虽然感觉说的太笼统了。但确实没什么毛病。sql注入来说,对用户的输入做好处理,对服务端的输出做好处理,对于我这样的菜鸡来说…

linux重启java项目

1.java项目占用的8888端口, 首先查看该进程的进程号: netstat -tunlp|grep 88882.占用8888端口的进程id为4179,杀死该进程: kill -9 41793.启动java项目: nohup java -jar demo-0.0.1-SNAPSHOT.jar &nohup 意思…

linux 如何重启oracle,Linux重启oracle数据库的三大技巧

Linux系统下网站出现问题的时候,可通过重启oracle数据库进行处理,而重启oracle数据库的方法有好多种,可登陆数据库进行操作,也可在终端操作,具体的随小编一起来了解下吧。 网站的服务中断了,重启下发现是oralce服务不存在,又不想重启机器,就重新启动下oralce,再重启服…

Linux重启nginx服务

1.方法一 到nginx下面的sbin目录下执行 ./nginx -s reload2.方法二 如果第一种不生效,(项目背景)实际项目不生效,也即部署到nginx下面的vue项目,已经更换为最新版本,但是仍然没有生效,可以使用…

linux重启程序

今天在Linux上部署程序出错,经检查最后是linux上的程序原来的该程序未停止,又重新启动该程序导致(相当与Linux上有两个该程序同时运行导致的错误) 解决方法: 1. 查看linux 上的线程 ps -ef | grep java2.运行结果 其…

pjax理解

注: http://www.itkee.cn/topic-info-75.html https://fly.layui.com/jie/10956/ http://bsify.admui.com/jquery-pjax/?idpjax-pushstate-ajax

thymeleaf 整合 pjax 无刷新跳转

原文地址: http://www.linzichen.cn/article/1577881001718185984 在一些需要做 seo 优化的应用里,比如门户网站、博客论坛网站、商城商品页网站等,我们的数据常常采用 服务端渲染的方式来展现,目的是为了让爬虫更好的抓取到&…

php pjax案例,jQuery pjax简单示例汇总

pjax 是一个jQuery插件,它使用 ajax 和 pushState 来实现快速的浏览体验,包括真正的固定链接,页面标题和工作返回按钮。本文主要和大家分享jQuery pjax简单示例汇总,希望能帮助到大家。 ajax缺点是破坏了浏览器的前进后退&#xf…

pjax php,php整合pjax(pushstate+ajax)实现无刷新页面

PJAX效果 通过url可以跟踪ajax的动态加载内容。这种技术尤其在two step view布局的视图中有很大的好处。无刷新加载页面,意味着响应速度和用户体验得到了极大的提升,在静态脚本和通用模块比较多的情况下,最大程度上节省了重用部分的开销。应用…

html5 pjax,pjax——页面无刷新跳转

pjax虽然不是什么新的技术,然而本人是最近才发现这个比较牛叉的技术。下面是对pjax的介绍: pjax是在HTML5里面引用的新技术,是对ajax pushState的封装,是实现无刷新ajax加载并解决浏览器前进和后退问题的一个开源实现。同时支持了…

java pjax_(转)PJAX的实现与应用

一、前言 web发展经历了一个漫长的周期,最开始很多人认为Javascript这们语言是前端开发的累赘,是个鸡肋,那个时候人们还享受着从一个a链接蹦到另一个页面的web神奇魔术。后来随着JavaScript的不断更新换代,他的功能不仅仅是为网页…

html5 pjax,关于PJAX局部刷新

前言部分 本教程最先来自鬼少博客,后论坛有人补充搜索和评论,然后又被各种转载,转完甚至还有阉割现象,导致会出现各种问题,于是,我这里再重发一次。虽然注释很清楚,但是,还有很多人看不懂&#…

java pjax_pjax简单实例

ajax缺点是破坏了浏览器的前进后退,因为ajax的请求不会留在历史记录中。pjax就不一样了,pjax被解释成ajaxpushState的封装,因为它把ajax的请求写入历史记录,并反映在地址栏,这样用户就能愉快地使用前进后退了。pjax有好…

Typecho开启全站Pjax

原文地址:Typecho开启全站Pjax 前言 因为上次更新后加入民音乐插件,但是有个问题就是在页面跳转的时候由于页面已经刷新了,所以音乐就不会继续播放了,就想着去引入Pjax来解决这个问题,同时引入pjax后比较直观的改变就…

pjax使用小结

前言 上周看到一篇文章在分析简书 我的主页 页面 3 个 tab 页切换的 bug,起先以为是寻常的样式 bug 而已没怎么在意,后来在文章中看到 pjax 这个术语,长得和 ajax 有点像,遂去了解了下。 简介 虽然传统的 ajax 方式可以异步无刷新…

网站访问速度优化之pjax

pjax 是 ajax 和 pushState 的结合,它是一个 jQuery 插件。它通过 ajax 从服务器端获取 HTML 文件,在页面中用获取到的HTML替换指定容器元素中的内容。然后使用 pushState 技术更新浏览器地址栏中的当前地址,并且保持了真实的地址、网页标题&…

idea热更新

配置idea热更新 第一步:下载插件 JRebel idea-file-settings-plugins搜JRebel 点击installed下载 我这里已经下载好。 第二步:配置GUID 点击jrebel Activation,开始配置 第一行是服务器地址:https://jrebel.qekang.com/{GUID} G…

webpack和vue热更新

目录 webpack一些概念介绍 webpack热更新流程 1. 启动阶段 ①->②->A->B 2. 更新阶段 ①->②->③->④ vue的组件热更新模块 总结 提到热更新,首先我们要有一个概念:Vue有热更新模块,而webpack也有它的HRM模块&#x…

JAVA实现代码热更新

JAVA实现代码热更新 引言类加载器实现热更新思路多种多样的加载来源SPI服务发现机制 完整代码类加载器共享空间机制Tomcat如何实现JSP的热更新Spring反向访问用户程序类问题补充细节推荐资源 引言 本文将带领大家利用Java的类加载器加SPI服务发现机制实现一个简易的代码热更新…