mercoledì 7 febbraio 2007

Adapter Oracle o misteri di Biztalk ??

Oggi stavo provando un orchestrazione... a un certo punto mi da un errore ORA-06502 !!
Avendo implementato un meccanismo di backup dei file ricevuti in pasto , sono risalito velocemente al file che ha generato l'errore. Per farla breve e semplificando accade questo:
1.  Bizzy riceve un file xml  al cui interno cè un campo DECIMAL
2. Ho una mappa che non fa altro che assegnare il valore di quel campo ad un altro schema
3 Il secondo file xml , istanziato dalla trasformazione serve per passare i dati a una stored procedure che va ad inserire i dati in oracle...

 Semplice no?

Ecco cosa accade... l'orchestrazione si incastra perchè dice che gli arriva un formato errato causato da una conversione sbagliata?!?!!?!? (il famoso errore ORA-06502),
ah.. dimenticavo il dato DECIMAL è scritto cosi 4.6 e non con la virgola!!! (poichè in oracle la , non funziona come separatore decimale) .

Un'altra cosa interessante è che l'adapter oracle è configurato mediante DNS, chè è legato al regional setting della macchina!!!
Ho cercato di capire il motivo e potrebbe essere:
1) Regional setting della macchina di biztalk ha impostato la , come separatore decimale
2) Regional setting della macchina di oracle ha impostato la , come separatore decimale
Non potendo gestire manualmente su queste impostazioni, poichè non sono amministratore della macchiana mi sono trovato in difficoltà!!
 Il perchè della trasformazione del valore 4.5 a 4,5 non lo ho capito bene chi lo fa... ma credo sia durante la chiamata SOAP per richiamare la stored (al SEND del messaggio tanto per capirci)...
 COME FARE????
Per ovviare il problema ho fatto cosi:
1) sapendo a priori dal DB la dimensione dei numeri decimali (sempre fissa)
2) ho usato nella mappa un functoid moltiplicatore e ho moltiplicato il valore per il numero dei decimali ( es. 4 decimali ... x10000)
3) ho ampliato chiaramente la dimensione della colonna nel DB per evitare problemi di dimensioni dato...
4) aggiornata la stored procedure di insert dividendo il valore per il valore del moltiplicatore ( es. /10000)
5) deployato :-)

ecco fatto! ora funziona!!!
Mi rimane cmq il dubbio.... e se qualcuno sa dirmi se ha trovato una VALIDA alternativa ....

Ciao!

Nessun commento: