[SSIS + ORACLE + SCD(forse)] aggiornare mensilmente una tabella fredda...

venerdì 18 settembre 2009 - 16.37

kingpin Profilo | Newbie

Ciao a tutti, sono nuovo, Alessandro Alpi mi ha consgliato di venire a farvi visita ed eccomi qua :)

questo è il mio primo post....veniamo subito al dunque

caso pratico
su un db oracle abbiamo 2 tabelle:

tabella1: è una tabella calda, viene continuamente modificata, il campo ID è la primary key
tabella2: è una tabella fredda, è la foto esatta della tabella1 a fine mese precedente

quello che io devo fare, alla fine di ciascun mese, è leggere la tabella1 e, per ciasun record, confrontarlo con lo stesso record sulla tabella2
- se i record sono identici, non faccio nulla
- se il record in tabella1 è diverso, aggiorno il record in tabella2 *

infine cancello da tabella2 tutti i record che non esistono piu in tabella1 (quelli cioè cancellati)

vincoli: devo usare per forza SSIS

domande:
- come devo fare per soddisfare la richiesta?
- forse SCD fà al caso mio?
- però SCD non mi fà usare il wizard perchè sto usando una connessione ad Oracle, c'è un modo per aggirare il problema?
- su vari siti suggeriscono di usare un altro tipo di SCD che si chiama KimballScd...suggerimenti?


* = variante
siccome non siamo contenti, c'è una variante
- se il record in tabella1 è diverso, tengo il vecchio record in tabella2 ma inserisco anche il nuovo record (diciamo la versione 2)


come potete capire dal tono del post, sono un esordiente totale su SSIS, le mie skill sono Oracle oriented....con una stored procedure l'avrei fatto in mezz'ora ma i requisiti impongono l'uso di SSIS

alx_81 Profilo | Guru

>Ciao a tutti, sono nuovo, Alessandro Alpi mi ha consgliato
>di venire a farvi visita ed eccomi qua :)
Ciao

>vincoli: devo usare per forza SSIS

>domande:
>- come devo fare per soddisfare la richiesta?
secondo me una stored procedure su oracle ed un OLEDBCommand sono una buona soluzione.
Basta far fare alla stored procedure su oracle, per id, quello che ti serve, come serie di comandi sotto transazione. Immagino dovrai usare PL-SQL.

>siccome non siamo contenti, c'è una variante
>- se il record in tabella1 è diverso, tengo il vecchio record
>in tabella2 ma inserisco anche il nuovo record (diciamo la versione2)
In questo caso SCD invece ti serve, ma non è fatto per ORACLE. Quindi, anche in questo caso, a mio avviso, risolvi tutto con una stored procedure in PL-SQL ed un OLEDBCommand.

Usi SSIS, ma lanci una stored procedure in PL-SQL.

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

kingpin Profilo | Newbie

Grazie mille Alessandro

proverò gli OLEDBCommand per invocare le stored PL/SQL...ma purtroppo uno dei vincoli è usare SSIS, se non c'era tale vincolo facevo tutto con packages PL/SQL e non avevo problemi...e invece :)

> In questo caso SCD invece ti serve, ma non è fatto per ORACLE.
...in che senso SCD non è fatto per ORACLE?


cmq continuando le mie ricerche ho trovato un altro SCD: TableDifference che a occhio e croce serve proprio per allineare 2 tabelle in modo furbo, testerò anche questo (visto che l'altro, KimballScd, per ora resta un illustre sconosciuto...)


alx_81 Profilo | Guru

>...in che senso SCD non è fatto per ORACLE?
il wizard intendevo.. mi aveva dato problemi con ORACLE.

>cmq continuando le mie ricerche ho trovato un altro SCD: TableDifference
>che a occhio e croce serve proprio per allineare 2 tabelle in
>modo furbo, testerò anche questo (visto che l'altro, KimballScd,
>per ora resta un illustre sconosciuto...)
Quello di SQLBI, Marco Russo e Alberto Ferrari. Ottimo, allora facci sapere!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

kingpin Profilo | Newbie

>il wizard intendevo.. mi aveva dato problemi con ORACLE.
è vero, il wizard non và, l'avevo scritto anche nel primo post. Però usando l'editor avanzato (show advanced editor) me lo fà configurare...ovviamente però per un principiante come me, l'editor avanzato mi blocca...mi serve qualcosa di guidato almeno all'inizio....

>Quello di SQLBI
si proprio quello, sono già riuscito a gestire le nuove righe (ramo new) mi mancano le righe modificate (ramo update) e le righe cancellate (ramo delete), da quel che ho capito, devo scrivere io a mano il comando sql che fà update e delete....

- per il delete devo passare l'id...si fà così?
delete from tabella2 where ID=@ID
?

- per l'update, il comando sql sarebbe
update tabella2 set campo1 = @campo1, ecc ecc...
ma non voglio certo riscrivere il nome di tutti i campi! Visto che le 2 tabelle hanno gli stessi campi con stesso nome, c'è un modo furbo di fare update su tutti i campi senza indicare esplicitamente il nome di ognuno? (ho tabelle con 100 e piu campi...)

alx_81 Profilo | Guru

Non conosco TableDifference purtroppo.
Di solito se il nome del campo di destinazione è identico al metadato che gli fai arrivare tramite task, in automatico hai il mapping.
Ma se devi scrivere il comando, credo che tu sia obbligato a definire a mano tutto.
Comunque, se puoi permetterti di scrivere dei comandi, non capisco perchè non usi oledbcommand con i comandi scritti in t-sql sotto transazione. Se proprio non puoi usare stored procedures, puoi comunque scrivere comandi no?
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

kingpin Profilo | Newbie

> se puoi permetterti di scrivere dei comandi
in teoria no, non dovrei scriverli, la richiesta di fare tutto con SSIS è appunto motivata dal fatto che, a regime, dovrà essere tutto grafico e visuale per poter essere manutenuto/modificato da persone non del mestiere...(no comment)
cmq, c'è un modo per fare update senza scrivere codice? qualcosa del tipo "aggiorna tutti i campi di tabella2 che si chiamano uguale ai campi in tabella1"...io questo sto cercando :)

> non capisco perchè non usi oledbcommand
oggi provo a invocare una stored con gli OLEDBCommand! :)

alx_81 Profilo | Guru

>> se puoi permetterti di scrivere dei comandi
>in teoria no, non dovrei scriverli, la richiesta di fare tutto
>con SSIS è appunto motivata dal fatto che, a regime, dovrà essere
>tutto grafico e visuale per poter essere manutenuto/modificato
>da persone non del mestiere...(no comment)
>cmq, c'è un modo per fare update senza scrivere codice? qualcosa
>del tipo "aggiorna tutti i campi di tabella2 che si chiamano
>uguale ai campi in tabella1"...io questo sto cercando :)
no.. il più vicino è OLEDBCommand, ma il comando devi scriverlo.
Altrimenti, se andassi in insert, la destinazione OLEDB o ODBC..


--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

kingpin Profilo | Newbie

>no.. il più vicino è OLEDBCommand, ma il comando devi scriverlo.
infatti......
ho appena provato OLEDBCommand per il ramo update...mi chiede di valorizzare SQLcommand, che in pratica è che la query di update....e torniamo al problema iniziale, non scrivere a mano tutti i nomi dei campi ma avere un mapping automatico dei campi origine-destinazione che hanno nome uguale!

>Altrimenti, se andassi in insert, la destinazione OLEDB o ODBC..
per il ramo new, vado in insert e ho provato OLEDB usando il provider "Oracle provider for OLE DB", si connette ma ottenendo solo una lista di errori che nemmeno mi entra nel monitor...te la incollo

prima

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

e poi

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


se incece tento di usare il provider "Microsoft OLE DB Provider for Oracle" mi dice:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


per ODBC invece, non trovo nulla nella toolbox, cosa devo usare?

alx_81 Profilo | Guru

>Se non si installano tali componenti, non sarà possibile utilizzare questo provider.
hai installato la parte client di connettività per ORACLE?

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

kingpin Profilo | Newbie

>hai installato la parte client di connettività per ORACLE?
si, ben 2:
client 10.2.0 (lo uso coi tool specifici per oracle, tipo toad, plsql developer, ...)
client 11.1.0 ODAC (lo uso per il mondo microsoft / .net)

alx_81 Profilo | Guru

>si, ben 2:
strano davvero. Magari prova a farti una virtual machine con una installazione pulita di tutto. Se ottieni gli stessi errori, credo che dovrai chiedere a chi conosce bene oracle e che ha usato SSIS.
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

kingpin Profilo | Newbie

>strano davvero. Magari prova a farti una virtual machine con una installazione pulita di tutto.
non dipende dall'istallazione, dipende secondo me dal saper scegliere il provider, ne ho molti per oracle (visibili nella maschera di SSIS), ognuno dà un certo errore...solo uno sembra funzionare:

NATIVE OLE DB:
Microsoft OLE DB Provider for Oracle -> Impossibile trovare il client e i componenti di rete Oracle.
Oracle provider for OLE DB -> Funziona!

.net PROVIDERS:
OracleClient Data Provider -> si connette ma dà errore sui tipi (errore unicode) visto qualche post sopra
Oracle Data Provider for .NET -> si connette ma dà errore sui tipi (errore unicode) visto qualche post sopra
ODBC data provider -> Error at Data Flow [Origine [725]]: Cannot acquire a managed connection from the run-time connection manager

.net PROVIDERS for OLE DB:
Microsoft OLE DB Provider for Oracle -> Impossibile trovare il client e i componenti di rete Oracle.
Oracle provider for OLE DB -> Error at Data Flow [Origine [725]]: Cannot acquire a managed connection from the run-time connection manager



ora, ignorando tutti gli altri e usando quello che funziona...riesco a gestire il ramo insert, ma non gli altri rami, ad esempio nel ramo delete uso un OLEDBCommand che esegue

delete from tabella2 where id = @id
-> Il provider non è in grado di ricavare le informazioni sui parametri e la funzione SetParameterInfo non è stata richiamata


ho provato ad usare ? invece di @id e qualcosa ha funzionato (su SQLserver però...), allego qualche screenshot screenshot (uno con destinazione SQLserver e uno con destinazione Oracle) perchè per SQLServer funziona alla perfezione, per Oracle non mappa le colonne di output, e forse può dipendere dal column code page:

DataReader Source: Warning relativo a column code page

611x241 32Kb


OLE DB Command: Non permette di scegliere le colonne di output:

624x721 64Kb


Invece su SQLServer funziona, come mostra l’immagine:

624x636 50Kb







Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5