Transparent Gateway problem: Oracle NUMBER -> MS SQL DECIMAL

Friday, 16.10.2009 – Dejan

Ovih dana smo imali jedan neočekivan problem prilikom prebacivanja podataka iz Oracle baze preko Transparent Gateway-a u jednu MS SQL Server bazu. Pojavljivala se nejasna greška:

ORA-28500: connection from ORACLE to a non-Oracle system returned this message

Pošto je sam tekst greške uopšten i ne prikazuje njen stvarni uzrok, izgubio sam nekoliko sati dok nisam otkrio u čemu je problem… A otkrio sam sasvim slučajno šta je uzrokovalo tu grešku, posmatrajući u debugging režimu podatke, koji se šalju MS SQL Serveru…

Naime, jedna od naših aplikacija se vrti na Windows platformi, gdje su lokalna podešavanja naštimana za njemački jezik (GERMAN_AUSTRIA.WE8MSWIN1252). Ta aplikacija se spaja na Oracle bazu sa podešavanjem AMERICAN_AMERICA.AL32UTF8, uzima određene podatke i preko TG4MSQL (Transparent Gateway for MS SQL) prebacuje ih u MS SQL Server bazu. Sve je radilo savršeno dok u igru nisu došli brojevi sa decimalama (npr. 104,589). Kada se pošalje cijeli broj (npr. 104), onda je sve u redu… MS SQL Server je bio podešen na AMERICAN_AMERICA.WE8MSWIN1252.

Posumnjao sam da MS SQL Server, tj. Transparent Gateway, ne prepoznaje decimalni separator kako treba… Pokušao sam simulirati drugačiji decimalni separator sa
TO_NUMBER(kolona,’999999999999999D999999′,’NLS_NUMERIC_CHARACTERS=”.,”’)
i sa
EXECUTE IMMEDIATE ‘alter session set NLS_NUMERIC_CHARACTERS=”.,”’;
, ali nije donijelo pozitivan rezultat…

Nakon googleanja i metalinkovanja uspio sam pronaći putokaz, koji me doveo do rješenja.

Ključni parametar, koji se mora podesiti u konfiguracijskoj init.ora datoteci (%ORACLE_HOME%\tg4msql\admin\initExampleMSSQL_SID.ora) je HS_LANGUAGE !

Nakon što sam taj parametar podesio na:

HS_LANGUAGE=AMERICAN_AMERICA.WE8MSWIN1252

mogli su se prebaciti i decimalni brojevi, a greška se više nije pojavljivala…

  1. 5 Responses to “Transparent Gateway problem: Oracle NUMBER -> MS SQL DECIMAL”

  2. Zanimljivo, susrećem se trenutno sa istim problemom, ali mi se čini u suprotnom smeru.
    Iz Oracle baze (10.2) pokušavam pozvati funkcije SQL Servera 2008 putem Transparent Gateway, problemi su sledeći:
    – decimalni brojevi su odsečeni
    – kada funkcija vraća text, char, varchar, javlja se greška: “ORA-28500: connection from ORACLE to a non-Oracle system returned this message: [Transparent gateway for MSSQL][Microsoft][ODBC SQL Server Driver]Invalid character value for cast specification (SQL State: 00000; SQL Code: 0)”

    Probala sam postaviti HS_LANGUAGE na sve načine koji su mi do sada pali na pamet, džaba. Imate li bilo kakvih ideja šta bih još mogla pokušati?

    By Jelena on Nov 9, 2009

  3. Jesi li provjerila, da se mozda negdje ne pokusava string konvertovati u broj?

    Koja teritorijalna podesavanja (regional settings) imas na MS SQL Serveru? Te vrijednosti moras staviti u HS_LANGUAGE kako treba…

    By Dejan on Nov 10, 2009

  4. Kako da proverim da li se string pokušava konvertovati u broj?

    Collation na SQL serveru je SQL_Latin1_General_CP1_CI_AS, Regional settings na računaru gde je SQL server su English (United States). Oracle baza ima podešavanja AMERICAN_AMERICA.EE8MSWIN1250

    By Jelena on Nov 10, 2009

  5. @Jelena: Sta ti stoji definisano pod HS_LANGUAGE? De ukljuci tracing:
    HS_FDS_TRACE_LEVEL=ON
    pa vidi, sta ti izbacuje u trace datoteci (%ORACLE_HOME%\tg4msql\trace\xxxxxx.trc) …
    Licno tu gresku nisam nikad dobijao, tako da ti ne mogu iz svog iskustva dati konkretno rjesenje…

    By Dejan on Nov 13, 2009

  6. Dobar savjet zlata vrijedi. Evo imao sam sličan problem – iz MS SQL baze sam preko ODBC-a (HS4ODBC) dovlačio određene vrijednosti, i imao sam problema s prikazom naših znakova. Sad sam postavio HS_LANGUAGE parametar u hs datotekama, i stvar radi…

    By MIhael Radovan on Feb 15, 2013

Post a Comment