简单场景中的包与存储过程?

时间:2015-03-11 15:34:58

标签: sql oracle plsql packages

我有一个包含多个内联查询的应用程序。我的计划是将它们变成存储过程,但经过一些研究后我发现包是可行的方法,但这只是一个额外的层来访问存储过程。我的所有查询都非常简单,只有SELECT语句,而CASE更复杂一些。将它们放入存储过程后,将它们放入包中对我有什么好处?

2 个答案:

答案 0 :(得分:0)

你的问题并不新鲜。关于独立程序与一揽子程序的讨论/讨论已经多次。

Thomas Kyte在他的网站上为一个类似的问题做了很好的回答,我想引用:

  

因为包

     
      
  • 打破依赖关系链(安装新的包体时没有级联失效 - 如果   你有程序调用程序 - 编译一个程序会使你的数据库失效)

  •   
  • 支持封装 - 我将被允许编写MODULAR,易于理解的代码 - 而不是   然后是单一的,不可理解的程序

  •   
  • 可测量地增加我的命名空间。包名称必须在模式中是唯一的,但我可以   跨包的许多程序具有相同的名称而不会发生冲突

  •   
  • 支持重载

  •   
  • 在您需要时支持会话变量

  •   
  • 促进整体良好的编码技术,让你编写模块化的代码,   可理解的,逻辑地组合在一起。

  •   
     

如果您是程序员 - 您会看到软件包的优势超过了独立的扩散   心跳的程序。

在此处详细了解https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:7452431376537

最好的是:

  

始终使用包裹。

     

除演示,测试和独立实用程序外,不要使用独立的程序   什么都不叫,什么都不叫“

答案 1 :(得分:0)

如果你有逻辑可以作为SQL语句的一部分来处理,那么,一般来说,我不建议将它们拉出来并将它们转换为函数(这是,让我们面对它,你是什么&# 39;无论是独立的还是包装内的,都可以将它们变成。

原因是当你在sql语句中有一个用户定义的函数调用时,sql语句必须跳出sql引擎,切换到pl / sql引擎然后再返回...对于每一行。这很可能会减慢您的查询速度。

当然,总会有例外情况 - 有时如果您经常使用函数调用返回相同的值,则可以使用函数缓存。

ETA:你说你有多个内联查询 - 如果它们全部相同(或非常相似),你可能会使用子查询工厂(也就是with子句又称公用表表达式(CTE))来实现结果