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