我们的应用程序在 oracle 10g 数据库上运行,我们现在计划将其迁移到 exadata。
为此,我们必须遵循一些 Exadata 会接受的合规性。
其中之一是在定义的开头将语句添加到每个现有的包/过程/函数
alter session set NLS_LENGTH_SEMANTICS='CHAR'
我只想检查一下,更改 session 以更改此 session 变量是否会影响代码功能?
在将这个语句添加到所有对象时,我们必须记住哪些事情?
任何线索将不胜感激
最佳答案
修订:
由于另一位受人尊敬的 Oracle 员工专家 (Sergiusz Wolicki) 的建议,我正在修改我的答案,并且修改了此参数的文档以警告不要将其设置为 CHAR 作为初始化参数的事实,以及警告仍然存在的事实那里是 12.1
http://docs.oracle.com/database/121/NLSPG/ch3globenv.htm#NLSPG234
Caution: Oracle strongly recommends that you do NOT set the NLS_LENGTH_SEMANTICS parameter to CHAR in the instance or server parameter file. This may cause many existing installation scripts to unexpectedly create columns with character length semantics, resulting in run-time errors, including buffer overflows.
警告:
如果 DDL 脚本是在没有明确语义的情况下编写的,那么设置参数不会影响它,但是,它显然不是在 Oracle 产品脚本中全面安全更新的内容。
使用编写良好的代码,它肯定不会影响“代码功能”,它是一个只会影响新字段宽度的设置。这里的关键似乎是你有多舒服,你可以保证这一点。
但是,如果 Oracle 对此发出警告,他们就有这样做的经验和证据。不了解长度语义的旧版应用程序或工具可能会受到影响。
Oracle 默认值传统上是
BYTE
由于向后兼容,但对于具有 的新数据库没有遗留的东西 ,更改它没有风险,并且不会影响内部数据字典,因为它们被锁定到 BYTE
无论 NLS_LENGTH_SEMANTICS 的数据库设置如何。
关于oracle - 在包/存储过程中改变 session NLS_LENGTH_SEMANTICS=CHAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26505576/