12 Şubat 2015 Perşembe

ORA-28500 hatası

Oracle Database Gateway for Teradata kullanarak Oracle 11g veritabanından Teradata veritabanına bir bağlantı oluşturduktan sonra, 11g'de aşağıdaki tns kaydı ile bir dblink oluşturduk

connect_descriptor=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host_name)(PORT=port_number))(CONNECT_DATA=(SID=gateway_sid))(HS=OK))
CREATE PUBLIC DATABASE LINK "link_to_teradata"
 CONNECT TO user_name
 IDENTIFIED BY 
 USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host_name)(PORT=port_number))(CONNECT_DATA=(SID=gateway_sid))(HS=OK))';
select atarken "date_field" alanını filtrelediğimizde 

Select
"date_field", "field_1", "field_2" --.....
from "table_name"@link_to_teradata
Where "date_field" >= to_date('2015-01-01','yyyy-mm-dd')

aşağıdaki şekilde bir hata aldık. 

ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
[Teradata][ODBC Teradata Driver][Teradata Database] Invalid date supplied for SM_DATA_QUALITY.DATE_TIME.  {22008,NativeErr = -2666}
ORA-02063: preceding 2 lines from SLM_TO_TERADATA

Bir kaç workaround (with clause, to_date() vs.) denedik ama hiç birinde de sonuç alamadık.

Geriye iki yöntem kalıyordu :
1)  ODI gibi bir ETL tool'u kullanarak tabloyu olduğu gibi Oracle veritabanına almak daha sonra bu tabloyu sorgulamak
2)  Yukarıdaki sorguyu TERADATA tarafında bir view'a almak ve tarih alanını STRING'e convert etmek.

Görüleceği üzere 2. yöntem daha az zahmetli ve daha esnek.

Sonuç olarak view'da tarih alanını şu şekilde yapınca sorun da düzeldi : 

CAST(CAST(date_field AS DATE FORMAT 'YYYY-MM-DD') AS CHAR(11)) date_field

tabi sorgumuzu da aşağıdaki gibi güncelledikten sonra :)

Select
"date_field", "field_1", "field_2" --.....
from "table_name"@link_to_teradata
Where to_date("date_field",'yyyy-mm-dd') >= to_date('2015-01-01','yyyy-mm-dd')

Hiç yorum yok:

Yorum Gönder