更改nls_length_semantics后重新编译包

时间:2010-08-03 15:30:07

标签: oracle character-encoding nls

我有一个数据库,其中nls_length_semantics值已从byte更改为char。是否有必要重新编译所有具有外部可访问的基于varchar2的数据类型的包(例如dbms_sql)?

2 个答案:

答案 0 :(得分:1)

@GWu在我看来是错误的。至少,他在精神上是错误的。这不是一个想要的问题,这是一个需要的问题。然而,他也是正确的,因为他说:它取决于

如果数据库中的基础数据是多字节的,那么您需要重新编译包。

我今天遇到了以BYTE格式编译软件包的问题,​​尽管我的表中的基础数据是用Unicode格式的。表已明确定义为(例如)VARCHAR2(20 CHAR),而我的PL / SQL包中的代码仅定义为VARCHAR2(20)。

这意味着数据库中定义的长度为50的列并不总是适合定义为长度为50的PL / SQL变量。我的用户报告了很多“字符缓冲区太小”的错误类型结果。

如果您的情况与我相同,则需要重新编译包。

然而,我真正想知道的是,我如何知道包是否以BYTE格式编译。这样我就可以确切地知道我的哪些包需要重新编译。如果不知道这一点,我就没有主动去那里重新编译它们的方法。我只需要等待用户报告问题。

我想我当然可以重新编译它们,但是当用户仍在其中时,这会锁定我的数据库。因此,我必须再次安排一些停机时间来解决整个问题: - (

<强> - 编辑 -

在发布之前,应该已经阅读了来自@AlexPoole的评论。视图dba_plsql_object_settings提供了我需要的信息!

答案 1 :(得分:0)

简短回答:这取决于: - )

如果您希望 现有包使用字符语义,则需要重新编译。否则,他们将保持编译时的设置。从技术角度来看,没有必要重新编译。

并且无需重新编译SYS拥有的软件包(如dbms_sql)。