gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:53:05 27 4
gpt4 key购买 nike

我观察到 Oracle 如何确定一个特定 Oracle 实例上的字符串表达式的数据类型的差异。最引人注目的例子是空字符串的数据类型:在所有实例上,除了一个数据类型是 char(0);在那个特殊的上它是 char(32)。

以下脚本说明了这一点:它解析一个简单的语句 SELECT '' FROM 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并玩弄(改变)dual .显然我已经模糊了服务器名称和密码...

 [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"

您的输出应如上所示。如果是不同的东西,那就可以解释这种奇怪之处了。

关于oracle - 什么会影响 Oracle 对字符串表达式数据类型的确定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9017540/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com