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