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
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')