在 Oracle 中使用包的优点和缺点
Pros and cons of using packages in Oracle
我对使用包还很陌生。我的团队正在决定是否在我们的应用程序中使用包。目前我们有 4 个应用程序正在使用内联 sql。我们决定将每个 sql 语句放在一个存储过程中,然后将存储过程逻辑分组到包中(这些存储过程将在应用程序之间共享)。使用包的潜在利弊是什么。
我们的应用程序是使用 c# asp.net 编写的。
如果您要让不同的应用程序访问相同的表,并且在数据库上发生相同的业务逻辑(例如约束等),那么存储过程是可行的方法。将它们视为 "front end"(即任何不是数据库的东西)和数据库之间的接口,就像网络服务提供到中间层的接口一样(我认为;我真的不在非数据库相关架构上!)。
您的可公开调用的存储过程通常是 create_a_new_customer
、add_a_new_address
、retrieve_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 结构中的某些更改)或其他一些小问题突然失败,因此只有一个存储过程变得无效。
这样的话,会不会整个包裹都失效了?影响整个应用程序?
另一方面,如果不使用包并创建独立的过程和函数,那么只有一个过程会失败。
我对使用包还很陌生。我的团队正在决定是否在我们的应用程序中使用包。目前我们有 4 个应用程序正在使用内联 sql。我们决定将每个 sql 语句放在一个存储过程中,然后将存储过程逻辑分组到包中(这些存储过程将在应用程序之间共享)。使用包的潜在利弊是什么。
我们的应用程序是使用 c# asp.net 编写的。
如果您要让不同的应用程序访问相同的表,并且在数据库上发生相同的业务逻辑(例如约束等),那么存储过程是可行的方法。将它们视为 "front end"(即任何不是数据库的东西)和数据库之间的接口,就像网络服务提供到中间层的接口一样(我认为;我真的不在非数据库相关架构上!)。
您的可公开调用的存储过程通常是 create_a_new_customer
、add_a_new_address
、retrieve_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 结构中的某些更改)或其他一些小问题突然失败,因此只有一个存储过程变得无效。
这样的话,会不会整个包裹都失效了?影响整个应用程序?
另一方面,如果不使用包并创建独立的过程和函数,那么只有一个过程会失败。