存储过程入门

https://blog.csdn.net/lengxiao1993/article/details/53427266

一段存储在数据库的“子程序”,下面对这两个部分进行分开的阐释。


   子程序(Subprogram): 
一段可以被调用的子程序(subprogram)要么是一个过程(Procedrue),要么是一个函数(function).
过程(Procerue)和函数(function)的区别之一是:函数总是只返回一个单个的值, 而过程并不是。(摘自Oracle Database concepts guide)


数据库的存储过程通常是指一系列的SQL语句构成的”SQL代码块”, 和普通的SQL语句的不同点是, 代码块中包含了原生SQL所没有的元素, 例如cursor, variable,if, else, loop。


    “存储在数据库” 
SQL语句都是需要通过数据库相应组件编译后才能执行,最常见的例子是通过JDBC, 或ODBC创建数据区连接,发送SQL语句给数据库执行,并在程序中获得数据库返回的结果。


存储过程则是把经常会被重复使用的SQL语句逻辑块封装起来,编译好,存储在数据库服务器端(这里的客户端是需要连接数据库的应用程序,但该应用程序本身也可能是一个Web服务器)。 这样,当存储过程再次被调用时,就无须编译了。 而调用的过程也无须发送SQL语句,只需要发送一个存储过程的标识, 数据库就可以找到相应的存储过程予以调用。


存储过程的概念在不同的数据库中是通用的。
存储过程的好处
性能提升 

开发维护的效率提升 

数据完整性与一致性 

安全性 

   存储过程的缺点


不易调试。 
   如果将 sql 逻辑通过应用程序控制, 可以很方便的加断点调试, 查看各个变量的值。 如果直接编写存储过程, 则很难调试, oracle 数据库的开发公爵 plsql developer 提供了一定的存储过程调试功能, 但是依旧不如应用程序的断点调试那么强大。


不易迁移扩展。 
   不同类型数据库的存储过程语法会有区别, 使用了存储过程会使得应用程序不具备迁移扩展能力。 不要问我为什么, 因为我就经历过一个在 sqlserver 有大量存储过程的应用程序迁移到 oracle 数据库的过程。


以PL/SQL为例的存储过程编写
PL/SQL Subprogram(子程序)的创建

    PL/SQL Subprogram存储过程的执行(三种):

利用oracle集成的工具,如 SQL PLUS或者 SQL Developer
在数据库应用程序的代码中调用
在另外一个存储过程或触发器(trigger)中调用(触发器的概念不在此文涉猎)

   PL/SQL 语言构成(Language Constructs)

  变量(variables)和常量(constants) 
可以在SQL存储过程中声明使用,和一般程序中的变量,常量的概念一致。
  游标(Cursor) 
可以在存储过程中声明使用, 主要用于实现面向数据记录(record oriented)的处理.
  异常(Exceptions) 
PL/SQL允许为自定义存储过程中会抛出的异常 ,和一般程序中的异常概念类似。


    PL/SQL运行过程:

  PL/SQL支持两种执行方式: native execution (本地执行) 和 interpreted execution (解释执行) 
解释执行, PL/SQL语句集会被编译成所谓的”字节码(bytecode)”的表示方式, 类似于Java 中的bytecode, 最后会被一个oracle数据库实现的虚拟机组件解释执行


本地执行, 会把PL/SQL直接编译成对应平台的object code(可以被链接成可执行程序), 由于没有解释执行的过程, 所以可以提供更好的性能。


图中的PL/SQL engine 是用来定义,编译,执行PL/SQL语句集的组件单元。 当数据库调用存储过程时, 数据库会将经过编译的PL/SQL语句集加载到系统全局区(system global area,SGA) 共享池(shared pool)中 。 (这里不对该概念作赘述,可暂且简单理解为一片内存区域)。 然后PL/SQL engine会和语句执行器(statement executor)一同工作,来处理存储过程中的语句。
总结
存储过程思想上很简单,就是数据库SQL语言层面的代码封装与重用。 所以广义上来说, 只要是被存储在数据库,可供
--------------------- 
作者:萧萧冷 
来源:CSDN 
原文:https://blog.csdn.net/lengxiao1993/article/details/53427266 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值