我们的应用程序在oracle 10g数据库上运行,我们现在正计划将其迁移到exadata。为此,我们必须遵循exadata可以接受的一些遵从性。其中之一是在定义的开头将语句添加到每个现有的包/过程/函数中
alter session set NLS_LENGTH_SEMANTICS='CHAR'我只想检查一下,改变会话来改变这个会话变量会不会影响代码的功能?在将此语句添加到所有对象时,我们必须记住哪些事情?
任何线索都将不胜感激
发布于 2014-10-22 20:42:29
修订:
我之所以修改我的答案,是因为另一位受人尊敬的Oracle员工专家(Sergiusz Wolicki)提出了建议,并且修改了有关此参数的文档以警告不要将其设置为CHAR作为初始化参数,以及警告仍然存在于12.1
http://docs.oracle.com/database/121/NLSPG/ch3globenv.htm#NLSPG234
警告: Oracle强烈建议您不要在实例或服务器参数文件中将NLS_LENGTH_SEMANTICS参数设置为CHAR。这可能会导致许多现有安装脚本意外创建具有字符长度语义的列,从而导致运行时错误,包括缓冲区溢出。
注意:如果DDL脚本是在没有显式语义的情况下编写的,那么设置参数不会对其产生影响,但是,显然不能在Oracle产品脚本中安全地对其进行全面更新。
对于写得很好的代码,它肯定不会影响“代码功能”,它只是一个影响新字段宽度的设置。这里的症结似乎是你在多大程度上能够保证这一点。
然而,如果甲骨文对此发出警告,他们有经验和证据这样做。不知道长度语义的遗留应用程序或工具可能会受到影响。
由于向后兼容性,Oracle默认值传统上是BYTE,但是对于没有遗留的新数据库,更改它没有风险,也不会影响内部数据字典,因为无论NLS_LENGTH_SEMANTICS的数据库设置如何,这些都锁定在BYTE语义上。
https://stackoverflow.com/questions/26505576
复制相似问题