2011-06-01 19 views
8

ben şu anda Değil çok karmaşık gibi görünüyor Oracle DBOracle neden dizgemi kullanıyor?

select tzname || ' (UTC'|| tz_offset(tzname) || ')' from v$timezone_names 

aşağıdaki sorguyu yürütmek deneyin. Sadece timzonun adı ve parantez içinde UTC ofseti. Ancak, pencerede PL/SQL Developer ile sorguyu çalıştırdığımda, her zaman son desteği alır.

Bu yüzden sqlplus'a gittim ve oraya koydum ve şimdi son ayraçlarımdan elde ettim ama aynı zamanda ekstra bir iyelik olarak son ayraçtan önce ek bir boşluk.

İç içe geçmiş to_char() ve trim() ile denedim ancak hiçbir şey değişmiyor. Farklı DB'lerde de denedim ama her zaman aynı.

tz_offset ve dize birleştirme ile ilgili bir sorun olup olmadığını bilen var mı?

+0

Görünüşe göre, açlıktan ölüyorsunuz. Verileri düzenli olarak besleyin ve amaçlanmadığı şeyleri yemez. –

+1

Oracle 11g'de yeniden üretildi. –

cevap

7

aşağıdaki sorguyu Düzenleyen:

select dump(tz_offset(tzname)) from v$timezone_names; 

Sen olsun bu gibi sonuçlar:

Typ=1 Len=7: 43,48,49,58,48,48,0 
Typ=1 Len=7: 43,48,49,58,48,48,0 
Typ=1 Len=7: 43,48,49,58,48,48,0 
Typ=1 Len=7: 43,48,49,58,48,48,0 
Typ=1 Len=7: 43,48,49,58,48,48,0 
Typ=1 Len=7: 43,48,49,58,48,48,0 
... 

Bu tz_offset() döner (belki bir hata) dizeleri boş sonlandırılmış olduğunu göstermektedir. sorgunuzla Yani, Oracle akılda, ben PL/SQL Geliştirici \ sonu dizesi olarak 0 (belki başka hata, SQL dizeleri boşlukla sonlandırılmış değildir) yorumladığı sanırım Having

"Africa/Algiers (UTC+01:00\0)" // Note \0 -> null character 
"Africa/Cairo (UTC+03:00\0)" // Note \0 -> null character 
... 

dönen ve bu yüzden dizenin geri kalanını yazmayı zahmet etmiyor, böylece izleyici parantezini kaybediyorsunuz. SQL * PLus, bunun yerine boş bir boşluk yazmayı seçer ve daha sonra dizenin geri kalanıyla devam eder ve kapanış ayracı yazdırır.

Bir geçici çözüm olarak, tz_offset(...)'u replace(tz_offset(...), chr(0)) ile değiştirebilirsiniz. Bu, null'ları tz_offset(...) döndürdüğünde siler.

+0

Teşekkür ederim, çok iyi bir açıklama! – Marcel

+0

PL/SQL Developer'a özgü bir hataya benziyor. Oracle SQL Developer, \ 0'ı küçük bir kare olarak gösterir ve dizeye eklenen tüm karakterleri gösterir. –

+0

@Jeffrey Kemp evet, ama bence 'tz_offset()' hiçbir durumda null sonlandırılmış dizeleri döndürmemelidir. – gpeche

1

Bu alt dize ile çalışır ama bu gerçekten o :-) neden oluyor sorunuza cevap vermez:

seçme tzname || '(UTC' || substr (tz_offset (tzname), 1,6) || ')' dan v $ timezone_names;

0

dilimi seçtim eklemeniz gerekir damgaları döndüren bir JSON ajax kaynak yaratıyordu ofset ... aşağıdaki gibi kapalı ise, kontrol karakteri sondaki ben, Döşeme gerçekten sinir bozucu olduğunu:

regexp_replace (tz_offset ('Kanada/Dağ '),' [[: cntrl:]] ',' ')