2011-09-26 55 views
2

场景:我对软件包一无所知,只是它们包含的函数和过程都包含在一个很好的小礼物中。所以今天我给了这个包(相当大)与“在这里,这是坏了请修复它”的指示。我见过一个,但是...... 10g包装究竟是什么?

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

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

1)除了所有东西的集合之外,一个包是否还有其他用途?

2)要部署此软件包,您是否需要设置部署空间以拥有该软件包所调用的所有视图/物化视图/表?如果没有,我假设该软件包将无法执行。

3)你可以编写程序包来跳过不能执行的函数和程序吗?

4)将一个成功编译成一个地方的软件包带到另一个地方时,我应该注意哪些其他的东西?

回答

6

1)除了一揽子服务之外,一个包还有其他用途吗?

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

考虑许多其他程序调用的(普通的,不是封装的)procedure XYZ(a in number)。如果此过程发生改变,则需要重新编译所有其他过程,这可能会降低系统的可用性。另一方面,如果程序是在package中声明的并且在package body中定义并且程序仅在主体中进行了更改(几乎),则不会发生重新编译。

2)要部署此软件包,是否需要设置部署空间,以便已经拥有该软件包所调用的所有视图/物化视图/表?如果没有,我假设该软件包将无法执行。

不,您可以安装package body,而不需要依赖视图或表格。包体的状态将为INVALID,并且不能使用包体的功能。

3)你可以编写程序包来跳过不能执行的函数和程序吗?

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

但是,如果爆炸出于合乎逻辑的原因(例如,除以零除),您总是可以使用exception when others then结构。

4)当把一个地方编译成一个地方的软件包带到另一个地方时,我应该注意些什么?

再次,不知道你在这里的意思。你能否详细说一下一个地方是什么?架构?一个实例?安装,公司....?

+0

问题4 ex。我把编译成功的软件包放在一起。但希望将其移动到另一个安装上的另一个用户模式。如果所有需要的观点/表格等已经到位,那么一切都应该顺利进行? – sealz

4

1)你几乎可以想到一个包类似于一个类。它是相关方法的逻辑分组。它也允许你封装不应该被其他人使用的相关“帮手”方法。它们可以包含在软件包中,只能通过成员方法访问。

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

3)定义“炸弹出”。如果存在必要的对象来成功部署包,那么其他一切都是运行时错误 - 应该编码的东西。认为异常处理。

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

+0

“类似于类”这正是我需要听到的。谢谢 – sealz

3

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

1) 软件包标头还可以包含其范围不仅仅是一个proc或函数的变量。

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

3. 如果添加: “异常时,别人再空;” 作为第2最后一行在proc中(紧接在“结束”之前)它可能会做你以后的事情。

4) 软件包可能需要授权/许可/角色/​​序列和可能的同义词以及其他相关procs /函数包才能运行。实际上,原始模式中的任何对象都可能在包中被引用,并且可能需要它或者需要授予。

+0

+1个不错的附加信息! –