我有一个数据库,其中的nls_length_semantics值已从字节更改为字符。是否有必要重新编译所有具有外部访问的基于varchar2的数据类型的包(例如dbms_sql)?
发布于 2014-10-14 11:38:49
@GWu在我看来是错误的。至少,他的精神是错误的。这不是匮乏的问题,而是需要的问题。然而,他也是正确的,因为他说:这取决于。
如果数据库中的底层数据是多字节的,则确实需要重新编译包。
虽然我的表中的底层数据是以Unicode格式编译的,但我今天在以字节格式编译包时遇到了问题。表被显式地定义为是(例如) VARCHAR2(20 CHAR),而我的PL/SQL包中的代码仅定义为VARCHAR2(20)。
这意味着以长度50定义的数据库中的列并不总是适合于定义为长度50的PL/SQL变量。因此,我的用户一直在报告许多“字符缓冲区太小”的错误。
如果您有与我相同的情况,则需要重新编译包。
然而,我真正想知道的是,如何知道包是否以字节格式编译。这样,我就可以确切地知道需要重新编译我的哪些包了。在不知道这一点的情况下,我没有一种积极主动地重新编译它们的方法。我只需要等待用户报告问题。
我想我当然可以重新编译它们,但是这会在用户还在的时候锁定我的数据库。因此,我不得不重新安排一些停机时间来解决整个问题:
-编辑--
在发帖之前,应该先阅读@AlexPoole的评论。视图dba_plsql_object_settings提供了我需要的信息!
发布于 2012-07-06 16:55:43
简短答覆:视乎情况而定:-)
如果您希望您的现有包使用char语义,则需要重新编译。否则,它们将保留编译时的设置。从技术角度来看,没有必要重新编译。
而且绝对没有必要重新编译SYS拥有的包(比如dbms_sql)。
https://stackoverflow.com/questions/3398076
复制相似问题