加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

什么会影响Oracle对字符串表达式数据类型的确定?

发布时间:2020-12-12 13:08:15 所属栏目:百科 来源:网络整理
导读:我观察到Oracle在一个特定Oracle实例上确定字符串表达式数据类型的方式存在差异.最引人注目的例子是空字符串的数据类型:在所有实例上,但是一个数据类型是char(0);在那个特殊的一个它是char(32). 以下脚本说明了这一点:它解析一个简单的语句SELECT”INN dua
我观察到Oracle在一个特定Oracle实例上确定字符串表达式数据类型的方式存在差异.最引人注目的例子是空字符串的数据类型:在所有实例上,但是一个数据类型是char(0);在那个特殊的一个它是char(32).

以下脚本说明了这一点:它解析一个简单的语句SELECT”INN dual并描述该列.

===
SET SERVEROUTPUT ON

DECLARE
  c           NUMBER;
  col_cnt     INTEGER;
  rec_tab     DBMS_SQL.DESC_TAB;
BEGIN
  DBMS_OUTPUT.PUT_LINE('Testing the datatype of an empty string:');
  c := DBMS_SQL.OPEN_CURSOR;
  DBMS_SQL.PARSE(c,'SELECT '''' as empty_string FROM dual',DBMS_SQL.NATIVE);
  DBMS_SQL.DESCRIBE_COLUMNS(c,col_cnt,rec_tab);
  DBMS_OUTPUT.PUT_LINE('max length = ' || rec_tab(1).col_max_len);
  DBMS_SQL.CLOSE_CURSOR(c);
END;
/
===

它在此特定实例上返回32,在所有其他实例上返回0.以下是在该特定实例上查询nls_database_parameters的结果:

PARAMETER       VALUE
--------------- ---------------
NLS_LANGUAGE    AMERICAN
NLS_TERRITORY   AMERICA
NLS_CURRENCY    $
NLS_ISO_CURRENCY    AMERICA
NLS_NUMERIC_CHARACTERS  .,NLS_CHARACTERSET    WE8MSWIN1252
NLS_CALENDAR    GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE   AMERICAN
NLS_SORT    BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT    DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT  HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY   $
NLS_COMP    BINARY
NLS_LENGTH_SEMANTICS    BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET  AL16UTF16
NLS_RDBMS_VERSION   11.1.0.7.0
NLS_CSMIG_SCHEMA_VERSION    5

它与所有其他实例没有区别.唯一不同的是安装的TDE选项.不幸的是我没有安装此选项的实例,无法在那里测试…

我的问题是,是否有人知道可能影响Oracle确定字符串表达式数据类型的方式的因素.空字符串的情况不是唯一的,但它是最关键的,因为我们有一个遗留应用程序,它发出大量带有空字符串的SELECT而不将它们转换为特定的数据类型,并且Oracle行为的差异使应用程序停止工作.任何输入将不胜感激!

康斯坦丁

非常好奇,我不能在9.2.0.1.0,10.2.0.1.0,11.1.0.6.0或11.2.0.1.0上复制它们,它们都具有几乎相同的参数(英国不是美国).

我能想到的唯一可能性就是有人在某个时候已经登录到sys并玩弄(改变)双重.显然我已经掩盖了服务器名称和pw ……

[oracle@server ~]$sqlplus -S "sys/pw as sysdba"

Session altered.

desc dual
 Name              Null?    Type
 ----------------- -------- --------------------------------------------
 DUMMY                      VARCHAR2(1)

set echo on
select dbms_lob.substr(dbms_metadata.get_ddl('TABLE','DUAL')) from dual;

DBMS_LOB.SUBSTR(DBMS_METADATA.GET_DDL('TABLE','DUAL'))
--------------------------------------------------------------------------------

  CREATE TABLE "SYS"."DUAL"
   (    "DUMMY" VARCHAR2(1)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 16384 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DE
FAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSTEM"

您的输出应如上所示.如果它有所不同,那就可以解释这种陌生感.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读