我见过一个但是...... 10g套餐究竟是什么?

时间:2011-09-26 21:17:31

标签: sql oracle plsql oracle10g package

场景:我对包不了解,除了它们包含的函数和程序都包含在一个漂亮的小礼物中。所以今天我得到了这个包(相当大)的说明“在这里,这是破碎的,请修理它”。

我终于清理了一切,这让我想到了我的问题。

在包的整体视图中,即将导出。

1)除了一切东西以外,包装是否可以用于任何其他目的?

2)要部署此程序包,是否需要将部署空间设置为已包含程序包调用的所有视图/物化视图/表?如果不是,我假设包将无法执行。

3)您是否可以编写程序包以跳过无法执行而无法执行的函数和过程?

4)当把在一个地方成功编制的包裹带到另一个地方时,我应该注意哪些其他的东西?

3 个答案:

答案 0 :(得分:6)

1)除了所有内容的集合外,包还可以用于其他目的吗?

除此之外,它还减少了在特定过程被更改时重新编译依赖于特定过程的其他过程的需要。

考虑许多其他程序调用的(普通的,不是包的)procedure XYZ(a in number)。如果更改此过程,则需要重新编译所有其他过程,这可能会降低系统的可用性。

另一方面,如果过程在package中声明并在package body中定义,并且过程仅在正文中更改,则(几乎)不会进行重新编译。

2)要部署此程序包,是否需要将部署空间设置为已包含程序包调用的所有视图/物化视图/表?如果不是,我假设包裹将无法执行。

不,您可以在没有相关视图或表的情况下安装package body。然后包体的状态为INVALID,并且不能使用包体的功能。

3)您是否可以编写程序包以跳过无法执行而无法执行的函数和过程?

不确定,问题究竟是什么。如果包体的状态为INVALID,则不能执行任何代码,因此不会发生“轰炸”

但是,如果由于逻辑原因(例如,除以零)发生轰炸,则可以始终使用exception when others then构造。

4)当把在一个地方成功编制的包裹带到另一个地方时,我应该注意哪些其他的东西?

再次,不确定你的意思。你能详细说明一个地方是什么吗?架构?一个实例?安装,公司....?

答案 1 :(得分:4)

1)你几乎可以认为一个包类似于一个类。它是相关方法的逻辑分组。它还允许您封装不应由其他任何人使用的相关“帮助程序”方法。它们可以包含在包中,只能通过成员方法访问。

2)为了成功部署一个软件包,是的,你必须拥有必要的表,视图等。如果不是,那么它不是一个包不能执行任何程序或功能的问题,它将没有正确部署。它将在数据字典中显示为未编译。

3)定义“炸弹”。如果存在成功部署包的必要对象,那么其他所有内容都是运行时错误 - 应编码的内容。想想异常处理。

4)同样,包中引用的必要模式对象必须存在。如果他们不这样做,包将无法编译,并将在数据字典中标记为。

答案 2 :(得分:3)

除了上面的其他有用的答案。

1) 包头也可以包含其范围不仅仅是proc或函数的变量。

2) 如果要移动包表/视图,则它们可能不必复制,如果它们位于同一数据库中,并且新模式具有查看旧表的权限。或者数据库链接是否可用于包含数据的数据库。在某些数据库版本中,在数据库链接上使用lobs可能存在限制。需要引用另一个模式中的表{schema-name}。{table-name}。数据库链接由{table-name} @ {database-link-name}指定。授予对另一个模式中的表的权限需要显式而不是通过角色 - 这就是oracle是如何

3。 如果你添加: “当其他人为空时例外;” 作为一个过程中的第二个最后一行(紧接在“结束”之前)它可能会做你想要的。

4) 可能需要授予/许可/角色/​​序列以及可能的同义词和其他从属过程/函数包来运行包。实际上,原始模式中的任何对象都可能在包中被引用,可能是需要的,或者可能需要它的授权。