Oracle Data Pump – parametri QUERY e EXCLUDE

giovedì 13 aprile 2017 alle 13:48 | Pubblicato su Diario | 1 commento

Oggi mi è capitato di dovermi cimentare con un esportazione di uno schema dati Oracle “selettiva”: per portare via un dump con schema e dati alleggerito. Non è la prima volta che mi capita ma questa volta avevo l’esigenza di introdurre diversi filtri sui dati e sugli oggetti. In realtà i filtri non erano particolarmente complessi ma sono incappato in un paio di particolarità che mi avevano gia messo in difficoltà altre volte ma che in tali occasioni avevo deciso di non approfondire rinunciando alla granularità dei filtri.

I parametri di Oracle Data Pump Export con cui ho lavorato sono QUERY, per filtrare i dati su alcune tabelle e EXCLUDE per escludere alcune tabelle che in realtà sono state introdotte come backup o prove o chissacosa nel tempo e che non avevo nessuna intenzione di portarmi dietro.

Query

il parametro query da manuale (11.2) prevede questa sintassi:

QUERY = [schema.][table_name:] query_clause

La parte “query_clause” è tipicamente la sezione “WHERE” di una query ma può essere qualunque clausola SQL, nel manuale riporta l’esempio di un “ORDER BY”. Su quest’ultima parte vado in fiducia perché ho avuto necessità solo di WHERE e solo quella ho provato.  Prima della query_clause è prevista come opzionale la specifica della tabella su cui applicare la clausola, se non viene specificata la clausola deve essere valida per tutte le tabelle esportate, quindi nella pratica deve riferire a qualche campo con un nome che si trova in tutte le tabelle esportate. Nel mio caso le tabelle esportate sono tante e il campo su cui filtrare ha sempre un nome diverso, quindi ho dovuto scrivere più occorrenze del parametro QUERY, una per ogni tabella, in questo modo:

QUERY=(tabella1:" WHERE t1campoa='a')
QUERY=(tabella2:" WHERE t2campoa='a')
QUERY=(tabella3:" WHERE t3campoa='a')
.....

 

Si possono tranquillamente mettere più occorrenze del parametro QUERY, naturalmente io uso un file di parametri, come consigliato anche dal manuale per non avere problemi di escape degli apici doppi. La cosa si complica se si vogliono clausole WHERE più complesse, qui mi limito a riportare il collegamento ad un ottimo post di Laurent Schneider che spiega come gestirli, un aiuto lo si trova anche fra i commenti.

Exclude

Questa la sintassi indicata sul manuale:

EXCLUDE=object_type[:name_clause] [, ...]

questo parametro mi ha fatto un po’ penare perché io avevo necessità di escludere tabelle il cui nome termina con “_O” oppure con “_BCK”.  Se avessi scritto:

EXCLUDE=TABLE:" LIKE '%_O'"

non avrebbe funzionato come volevo perché “_” in SQL è analogo a “%” e indica un carattere qualsiasi, quindi di fatto avrei escluso tutte le tabelle il cui nome termina con “O”. In SQL da lungo tempo (se non erro dalla versione 10 di oracle) si usare un carattere per fare l'”escape” quindi solitamente io scrivo:

SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE '%\_O' ESCAPE '\';

Ecco, scrivendo

EXCLUDE=TABLE:" LIKE '%\_O' ESCAPE '\' "

ottenevo l’errore:

ORA-39001: invalid argument value
ORA-39071: Value for EXCLUDE is badly formed.
ORA-01425: escape character must be character string of length 1

Confesso che al primo giro non ho letto con attenzione la terza riga dell’errore, quindi ho fatto un paio di tentativi ed ho affinato le mie ricerche su internet fin quando finalmente sono arrivato a questo post che nella sua parte finale da un lato mi ha confermato che la sintassi che usavo era corretta dall’altro mi ha fatto venire il dubbio che il mio problema fosse solo il carattere di escape scelto, quindi, prima ancora di cercare di capire come mai il mio “\” non gli piacesse l’ho sostituito con un “!” ed ho riprovato

EXCLUDE=TABLE:" LIKE '%!_O' ESCAPE '!' "

magicament ha funzionato.

Mi sono imposto di segnarmi questa cosa in modo da non scordarla più, dunque quale posto migliore se non un nuovo post qui!

 

Riferimenti:

  1. http://www.usn-it.de/index.php/2009/05/22/oracle-impdp-wildcard-hacking/
  2. http://laurentschneider.com/wordpress/2011/07/datapump-table-like-foo-or-like-bar.html

 

 

Annunci

1 commento »

RSS feed for comments on this post. TrackBack URI

  1. Come sempre bravo Cudizio.
    E’ effettivamente un maze e la notazione e’ complessa. Puo’ essere di grande aiuto quanto tu hai scritto. Lo conservero’ in evidenza anch’io per il futuro.
    Grazie.
    lottini


Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Blog su WordPress.com.
Entries e commenti feeds.

%d blogger hanno fatto clic su Mi Piace per questo: