oracle存储过程深入,深入了解oracle存储过程的优缺点

定义:

存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。 存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。在Oracle 中,若干个有联系的过程可以组合在一起构成程序包。

优 点:

1.存储过程可以使得程序执行效率更高、安全性更好,因为过程建立之后 已经编译并且储存到数据库,直接写sql就需要先分析再执行因此过程效率更高,直接写sql语句会带来安全性问题,如:sql注入 。存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

2.建立过程不会很耗系统资源,因为过程只是在调用才执行。

3.存储过程可以用于降低网络流量,存储过程代码直接存储于数据库中,所以不会产生大量T-sql语句的代码流量。

4.使用存储过程使您能够增强对执行计划的重复使用,由此可以通过使用远程过程调用 (RPC) 处理服务器上的存储过程而提高性能。RPC 封装参数和调用服务器端过程的方式使引擎能够轻松地找到匹配的执行计划,并只需插入更新的参数值。

5.可维护性高,更新存储过程通常比更改、测试以及重新部署程序集需要较少的时间和精力。

6.代码精简一致,一个存储过程可以用于应用程序代码的不同位置。

7.增强安全性:

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

b、提高代码安全,防止 SQL注入(但未彻底解决,例如,将数据操作语言--DML,附加到输入参数);

c、SqlParameter 类指定存储过程参数的数据类型,作为深层次防御性策略的一部分,可以验证用户提供的值类型(但也不是万无一失,还是应该传递至数据库前得到附加验证)。

可以封装数据逻辑和业务规则,以便用户可以仅通过开发人员和数据库管理员打算使用的方式访问数据和对象。

验证所有用户输入的参数化存储过程可用于阻止 SQL 注入攻击。 如果使用动态 SQL,请确保将命令参数化,并绝对不能将参数值直接包括在查询字符串中。

可禁止即席查询和数据修改。 这样将阻止用户恶意或无意中损坏数据或执行查询,以避免降低服务器或网络的性能。

可以在过程代码中处理错误,而无需将错误直接传递给客户端应用程序。 这样可防止返回错误消息,以避免其可能有助于探测攻击。 在服务器上记录错误并对其进行处理。

存储过程只能编写一次,可由很多应用程序访问。

客户端应用程序不需要知道有关基础数据结构的任何信息。 只要更改不影响参数列表或返回的数据类型,就可以更改存储过程代码,而无需在客户端应用程序中进行更改。

存储过程可通过将多个操作组合到一个过程调用中来减少网络通讯。

安全性好—可以访问执行存储过程而不必拥有直接操作基础表的权限

减少网络通信流—存储过程可以包含多条SQL语句,但只要用一条语句来执行该存储过程,从而减少了客户端应用程序对服务器的调用次数和长度

快速执行—存储过程在第一次执行时进行语法检查和编译,编译好的版本存储在高速缓存中,用于再次调用

保证一致性—如果用户只通过存储过程修改数据,则可以消除偶然修改带来的问题减少操作人员和编程人员的错误—由于传递信息少,因此执行复杂任务更容易,不易出现SQL错误

借用SQL SERVER的存储过程示意图来表达一下,理解一下概念就好,具体到Oracle请另行查询

存储过程的运行示意图如下:

055ad97a7b625ef6b8081db0da679df9.png

首先运行CREATE PROC过程。这回解析查询以确保会实际运行这些代码。它与直接运行脚本的区别在于CREATE PROC命令可以利用所谓的延迟名称解析。延迟名称解析可以忽略一些对象还不存在的事实。

在创建了存储过程后,它将等待第一次执行。在那时,存储过程被优化,而查询计划被编译并且缓存到系统上。后续几次运行该存储过程时,除非通过使用WITH RECOMPILE选项指定,否则都会使用缓存的查询计划而不是创建一个新的查询计划。这意味着每次使用该存储过程时,存储过程都会跳过很多优化和编译工作。节省的确切时间取决于批处理的复杂性,批处理中表的大小,以及每个表上索引的数量。通常,节省的时间不是很多。但对于大多数场景来说可能是1秒或更少-但通过百分比可以计算出此区别(1秒比2秒快了100%)。当需要进行多次调用时或针对循环的情况,这一区别会变得更明显。

存储过程与函数的对比

1eef20a07de52add12fdf88a878a599f.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Java 8中使用LocalDateTime格式化/解析日期-示例教程

Java项目中的常见任务之一是将日期格式化或解析为String,反之亦然。 解析日期表示您有一个表示日期的字符串,例如“ 2017-08-3”,并且要将其转换为表示Java中日期的对象,例如Java 8之前版本中的java.util.Date以及LocalDate或Loca…

如何获取当前刀具号_数控刀具的选用原则,如何使用数控刀具?一文全面介绍数控刀具...

数控刀具选用概述学习数控相关知识,最基础的是认识和了解刀具的材料以及选用原则,我们应当了解数控刀具的种类及特点、如何正确选择和使用数控加工刀具;学会根据被加工材料来合理选择数控刀具的材料和切削参数。选用原则:数控车床…

Java命令行界面(第27部分):cli-parser

CLI Parser最初托管在Google Code上,现在已存档在Google Code上 ,现在可以在GitHub上使用 。 归档的Google Code项目页面将CLI解析器描述为“使用非常简单,非常小的依赖项”,它使用注释“使非常简洁的主要方法不需要知道如何解析带…

linux系统中如何安装qwt,linux下Qt开发环境中qwt库的安装与使用

qwt的安装与使用安装好qt开发环境后,先去下载qwt库源代码。以我下载的qwt-6.0.1.zip为例,解压得到qwt-6.0.1。1.安装qwt-6.0.1执行下面的命令:1 cd qwt-6.0.12 qmake3 make4 make install这样就完成qwt-6.0.1的安装了,安装的路径是…

moxy json介绍_MOXy的对象图和动态JAXB

moxy json介绍JAXB(JSR-222)使您可以轻松地将域类的实例转换为XML。 EclipseLink MOXy实现提供了一个称为Dynamic JAXB的扩展,在其中,您可以使用诸如DynamicEntity之类的映射实例代替真实的类​​。 您可以使用采用属性名称的get和…

linux 查看服务器作业,linux – 如何在服务器负载较低时运行作业?

我有一个运行磁盘快照的命令(在EC2上,冻结XFS磁盘并运行EBS快照命令),该命令设置为作为cron作业定期运行.理想情况下,如果在任务计划运行时磁盘被大量使用,我希望能够将命令延迟一段时间.我担心使用nice / ionice可能没有正确的效果,因为我希望脚本在运行时以高优先级运行(即等…

wordcloud python3.6能用吗_Python3.6环境下安装wordcloud模块遇到的问题及解决办法

“error: Microsoft Visual C 14.0 is required…”问题解决今天在Python 3.6环境中,制作词云,需要安装wordcloud模块,在安装的过程中遇到了“error: Microsoft Visual C 14.0 is required…” 的问题,很是烦恼,最后找…

使用基本身份验证来保护Spring Boot REST API

这是我的Spring Boot Blog帖子系列的第三篇文章。 在第一篇文章中,我谈到了我使用Spring Boot创建RESTFul Services的经验。 然后我将样本扩展到 与Swagger文档集成 。 在这篇文章中,我将在安全方面扩展上述示例。 什么是API安全性 API安全性广泛&…

使用2.26内核的linux,介绍linux 2.6.9-42内核升级到linux 2.6.26-42的方法

介绍linux 2.6.9-42内核升级到linux 2.6.26-42的方法来源:互联网作者:佚名时间:2013-04-10 13:32这篇升级Linux内容的文章,是基于Red Hat的Linux版本,从linux 2.6.9-42内核升级到linux 2.6.26-42的方法,对于…

python xlwt xlrd 写入一行_自己总结python用xlrd\xlwt读写excel

1.首先安装xlrd\xlwt模块xlrd模块下载地址:https://pypi.python.org/pypi/xlrdxlwt模块下载地址:https://pypi.python.org/pypi/xlwtlinux 安装命令 python setup.py installwindos 安装命令 setup.py install2.使用方法大全基础方法推荐请看这里:http://blog.csdn.net/mr__fan…

linux时间路径,关于linux中的时间 时区问题

本文部分来源于: http://hi.baidu.com/peruke/blog/item/b8de06ec6a04583b27979132.html系统是fedora:glibc实现了从RTC时间到人可读时间的一个转换,一般系统不适用 环境变量TZ进行时区的设置,因为环境变量存在一些缺陷&#xff…

Java命令行界面(第1部分):Apache Commons CLI

尽管我通常使用Groovy编写要从命令行运行的JVM托管脚本,但是有时候我需要解析Java应用程序中的命令行参数,并且有很多库可供Java开发人员用来解析命令行参数。 在本文中,我将介绍这些Java命令行解析库中最著名的一种: Apache Comm…

python自带的idle输入python_打开python自带IDLE出的问题

打开python自带IDLE编辑器时出的问题IDLE cant bind to a TCP/IP port, which is necessary tocommunicate with its Python execution server. This might bebecause no networking is installed on this computer. Run IDLEwith the -n command line switch to start without…

linux 虚拟机新增磁盘,linux(虚拟机)下新增磁盘配置

Linux的硬盘识别:(1)”fdisk -l”命令可以列出系统中当前连接的硬盘设备和分区信息.新硬盘没有分区信息,则只显示硬盘大小信息.(2)创建新硬盘分区命令参数:fdisk可以用m命令来看fdisk命令的内部命令;a:命令指定启动分区;d&#xf…

丙烯怎么做成流体丙烯_韧性好强度高的聚丙烯复合材料怎么做?让人工智能来帮忙...

01背景介绍聚丙烯(PP)是一种应用广泛的通用塑料,价格便宜、力学性能好、热稳定性高,在机械、汽车、电子电器、建筑、纺织、包装和食品工业等领域应用广泛。聚丙烯韧性和冲击强度不高,限制了它的应用。加入热塑性弹性体(TPE),如苯乙…

1.x到2.x的迁移:可观察与可观察:RxJava FAQ

标题不是错误。 rx.Observable 1.x的io.reactivex.Observable与2.x的io.reactivex.Observable完全不同。 盲目升级rx依赖关系并重命名项目中的所有导入将进行编译(稍作更改),但不能保证相同的行为。 在项目的早期, Observable in …

linux 线程 拷贝,linux下实现多线程拷贝命令

实现多线程拷贝命令,如:./multithread_copy srcfile destfile N(拷贝线程个数)难点:内存映射mmap。给每一个线程合理的分配任务。多线程的实现。具体的实现代码如下:/********************************************************************…

vivado安装_Vivado下载与安装指南

Vivado下载与安装指南目前,vivado已推出2019.1版本,实验室所安装的为2018.3版本,由于软件向下兼容的特性,建议安装2018版本,若安装2019版本,请自带笔记本,安装过程与之前没有差别,这…

linux中kafka主题修改分区,kafka_2.11-2.0.0的部署与配置修改

1 [yunmini01 config]$ pwd2 /app/kafka/config3 [yunmini01 config]$ vim server.properties4 ############################# Server Basics #############################5 # 每一个broker在集群中的唯一标示★★★6 # 比如mini01 为0 mini02 为1 mini03 为27 broker.id089…

python中字符串乘法_python leetcode 字符串相乘实例详解

给定两个以字符串形式表示的非负整数 num1 和 num2 ,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 "2", num2 "3"输出: "6"示例 2:输入: num1 "123", num2 "456&quo…