что влияет на определение Oracle типа данных строковых выражений? - PullRequest
8 голосов
/ 26 января 2012

Я наблюдаю разницу в том, как 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 onэтот конкретный экземпляр и 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 не позволяет приложению работать.Любой вклад будет оценен!

Константин

1 Ответ

1 голос
/ 26 января 2012

Очень любопытно, я не могу повторить это на 9.2.0.1.0, 10.2.0.1.0, 11.1.0.6.0 или 11.2.0.1.0, и все они имеют почти идентичные параметры (Великобритания, а не США).

Единственная возможность, о которой я могу думать, это то, что кто-то в какой-то момент вошел на sys и поиграл с (измененным) dual.Очевидно, я скрыл имя сервера и 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"

Ваш вывод должен выглядеть так, как указано выше.Если бы это было что-то другое, это объяснило бы странность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...