在 Oracle 中使用包的优点和缺点

Pros and cons of using packages in Oracle

我对使用包还很陌生。我的团队正在决定是否在我们的应用程序中使用包。目前我们有 4 个应用程序正在使用内联 sql。我们决定将每个 sql 语句放在一个存储过程中,然后将存储过程逻辑分组到包中(这些存储过程将在应用程序之间共享)。使用包的潜在利弊是什么。

我们的应用程序是使用 c# asp.net 编写的。

如果您要让不同的应用程序访问相同的表,并且在数据库上发生相同的业务逻辑(例如约束等),那么存储过程是可行的方法。将它们视为 "front end"(即任何不是数据库的东西)和数据库之间的接口,就像网络服务提供到中间层的接口一样(我认为;我真的不在非数据库相关架构上!)。

您的可公开调用的存储过程通常是 create_a_new_customeradd_a_new_addressretrieve_customer_details 等,其中对每个操作背后的逻辑进行编码,相关过程将分组为同一个包。您不会希望编写一系列仅在表上执行 dml 的过程,并期望应用程序确定何时调用每个过程。

所以你想就使用包的优缺点展开辩论?好的,如果您可以与我们分享,那么我会把缺点部分留给您。我将只与您分享我的优势,而不是用我自己的话,因为这将重复 Thomas Kyte 已经说过的话 here:

  • break the dependency chain (no cascading invalidations when you install a new package body -- if you have procedures that call procedures -- compiling one will invalidate your database)

  • support encapsulation -- I will be allowed to write MODULAR, easy to understand code -- rather then MONOLITHIC, non-understandable procedures

  • increase my namespace measurably. package names have to be unique in a schema, but I can have many procedures across packages with the same name without colliding

  • support overloading

  • support session variables when you need them

  • promote overall good coding techniques, stuff that lets you write code that is modular, understandable, logically grouped together....

If you are a programmer - you would see the benefits of packages over a proliferation of standalone procedures in a heartbeat.

这是这个问题的便捷决策图。

只是增加了使用包的副作用...

如果我有一个包,其中包含我申请 运行 所需的所有存储过程和函数。考虑一个小的存储过程由于某些问题(例如 table 结构中的某些更改)或其他一些小问题突然失败,因此只有一个存储过程变得无效。

这样的话,会不会整个包裹都失效了?影响整个应用程序?

另一方面,如果不使用包并创建独立的过程和函数,那么只有一个过程会失败。