lunedì 26 gennaio 2009

Oracle e SQL Server


Settimana scorsa mi è stato chiesto se fosse possibile condividere l'anagrafica fornitori contenuta in una tabella su un nostro db Oracle con un software di gestione magazzino che utilizza una base dati su piattaforma SQL Server 2005.
Una breve ricerca su Google mi ha portato ai linked servers, ossia componenti di Microsoft SQL Server (io ho usato la versione 2005 Standard Edition) che consentono a questo RDBMS di poter comunicare con sorgenti dati eterogenee come Oracle, oppure AS400 e persino con fogli di calcolo Excel!
Le componenti di un linked server sono due:

* provider OLE DB (una DLL che gestisce la comunicazione con una sorgente dati)
* sorgente dati OLE DB


Cercando una guida che spiegasse come impostare un linked server da SQL Server ad Oracle mi sono imbattuto in questo post sul blog di Greg Wright, davvero chiaro e ben fatto.
Sostanzialmente, Greg suggerisce in prima istanza di installare il client Oracle (possibilmente in una versione compatibile con quella del db Oracle cui ci si deve collegare) sulla stessa macchina su cui è installato SQL Server, quindi, usando Net Manager, oppure modificando manualmente il file tnsnames.ora, si deve configurare un service name che punti al db Oracle desiderato. Nel post, segue la configurazione del linked server ed, infine, un esempio di query lanciata via SQL Server sul db Oracle a cui ci si deve collegare.
In particolare, volendo eseguire una SELECT sul db Oracle via linked server, la sintassi da utilizzare è:
select * from openquery(linked server, 'select * from dbname.tablename where clause')
La chiave dell'istruzione precedente è la funzione openquery il cui scopo è quello di restituire una tabella con il record set della query (il secondo parametro della funzione) eseguito sul db (Oracle) a cui ci si collega mediante linked server (il primo parametro della funzione).
Volendo è anche possibile eseguire join tra tabelle SQL Server e tabelle Oracle con una sintassi del tipo:
select tabellaSQLServer.campo1, X.campo2, X.campo3
from tabellaSQLServer
join openquery(nomeLinkedServer, 'select * from AltraTabella where Condizione=1') X
on tabellaSQLServer.campoSQLServer = X.campoAltraTabella
Bene, è tutto, ora continuo con i miei test di connessione SQL Server - Oracle!

2 commenti:

pippo ha detto...

Per caso sai se si può
creare un linked server
da una macchina windows a 32
con SQL 2005 verso una macchina Red Hat con Oracle 10.2.0.4 a 64 bit?

Simone Saravalli ha detto...

Ciao Pippo,
scusa se ti rispondo solo ora, ma ho abbandonato il sito, anche se a malincuore, perche' ho cambiato lavoro e non mi occupo piu' di Oracle. Ad ogni modo, non credo ci siano problemi per il caso che mi hai descritto. Ad esempio, io mi sono spesso connesso tra una virtual machine a 32 bit con win server 2003 e SQL Server 2005b verso un Oracle 10.2.0.4 installato su Debian Etch, sempre in ambiente virtuale e senza problemi di sorta.