2012-01-26 15 views
8

Oracle'ın, belirli bir Oracle örneğindeki dize ifadeleri veri türünü nasıl belirlediğiyle ilgili bir farkı gözlemliyorum. En çarpıcı örnek, boş bir dizenin veri türü: tüm örneklerde ancak bir veri türü char (0); Bu istisnai bir şekilde char (32). Oracle'ın string ifadeleri veri türünü nasıl belirlediği nedir?

aşağıdaki komut

bunu göstermektedir: Bu ikili GELEN basit deyimi SEÇ '' ayrıştırır ve sütun açıklar.

=== 
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; 
/
=== 

Bu özel örnekte 32 ve diğerlerinde 0 değerini döndürür. Diğer tüm durumlarda farklı değildir

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 

: Aşağıdaki belirli örneğinde nls_database_parameters sorgulama sonucudur. Farklı olan tek şey yüklü TDE seçeneğidir. Ne yazık ki, bu seçenekle bir örneğim yüklenemedi ve orada test edemiyorum ...

Benim sorum, Oracle'ın dize ifadelerinin veri türünü belirleme biçimini etkileyebilecek faktörleri bilen biri. Boş dizeleriyle durumda tek değil, ama biz çalışmaktan uygulamayı durdurur belirli veri türü ve Oracle'ın davranış olduğunu fark etmelerini olmadan döküm boş dizeleri ile SELECTleri sürü sorunları eski uygulamaya sahip olarak en kritik. Herhangi bir girdi takdir edilecektir!

Konstantin

+0

aynı sorun olması ve nihayet, tx bunu saptamak mümkün Senaryonuzu kullanılır. Bir çözümle karşılaştınız mı? –

+0

Hayır, yapmadım :( –

+0

Oracle'la bir dava açtık. Eğer bir şey çözülürse size geri göndereceğim. –

cevap

1

Çok meraklı, (ı 9.2.0.1.0, 10.2.0.1.0, 11.1.0.6.0 veya 11.2.0.1.0 bu çoğaltmak edemez ve hepsi aynı parametrelerle yakın olması Birleşik Krallık değil ABD).

Düşünebildiğim tek ihtimal, bir noktada sys oturumunu açtı ve (değiştirildi) dual ile oynadı. Açıkçası ben sunucu adını ve pw ...

[[email protected] ~]$ 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" 

Çıktınız yukarıdaki gibi görünmelidir gizlenmiş ettik. Eğer farklı bir şey varsa, bu garipliği açıklar.

+0

o ikiliden hiçbir şey seçmiyor '' seçer.Bir çift sütun ile bir satır içerebilir (NUMBER) ve sonuç aynı olacak. –

+0

Hayır, DUAL değiştirilmez ve yalnızca bu test komut dosyasında kullanılır. Gerçek ifadeler gerçek tabloları kullanır. Herhangi bir şekilde yardımcı olursa, veri türü belirlemesindeki farkın diğer örneği, bir VARCHAR2 sütunundaki herhangi bir ifadedir. Örneğin, VARCHAR2 (10), veri türü bir kolon COL var ve listedeki rtrim (sütun) 'de bir ekspresyon Oracle sütunun veri türü ile ilgili veri türü elde etmeye çalışır çalıştığımız tüm durumlarda (10 g) üzerinde, var. Burada char (10) dönecekti. Bu özel örnekte, sonuç her zaman char (4000) ... –

İlgili konular