2015-01-21 13 views
5

Ho un compito semplice (almeno lo immagino): confrontare 2 tabelle in base a nomi delle colonne, tipi di dati e lunghezza solo per verificare che abbiano la stessa struttura fino ad ora. Dovrebbe essere fatto in uno script perl esistente che si connette a due diversi database.Dove si perb dbi: Oracle table_info/column_info ottiene le loro informazioni?

Prima ho semplicemente interrogato ogni database user_tab_columns e ho confrontato il risultato. Ora ho scoperto che il user_tab_columns non è attivo, ma deve essere aggiornato analizzando la tabella (http://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_4462.htm#REFRN26277), di cui non avevo assolutamente la minima idea.

describe ottiene la definizione della tabella effettiva, ma non sembra funzionare tramite perls dbi: Oracle, quindi sono incappato sui metodi table_info() e column_info(). Ma da dove prendono le informazioni? Se interrogano solo *_tab_columns, non mi sono d'aiuto.

Non riesco a testare semplicemente perché non sono ancora riuscito a passare i parametri corretti. Il Dbi Documentation dice che è secondo il driver del database. Lo Oracle DBD Documentation non mi è stato di grande aiuto, finora le prove e gli errori hanno portato a ottenere tutti gli oggetti o niente.

Al momento sto pensando di eseguire describe tramite sqlplus attraverso una chiamata di sistema perl e l'analisi l'uscita .... ma ci ha ad essere un modo migliore.

EDIT:

La vista user_tab_columns funziona come previsto, se controllando le colonne di destra (vedi commenti qui sotto).

+0

Penso che abbiate frainteso qualcosa dalla documentazione! user_columns è una tabella, che è sempre aggiornata al 100% - l'unica cosa che cambia con ANALYZE sono le colonne che includono i dati statistici. Ma le colonne come Name, Type ... sono sempre esattamente come DESCRIBE – Falco

+0

Hm è quello che pensavo anch'io, ma: 'seleziona nome_colonna, tipo_dati, data_length da user_tab_columns dove table_name = 'MY_TABLE' e column_name = 'MY_COLUMN';' mi dà una lunghezza dati di 200. SELECT dbms_metadata.get_ddl ('TABLE', 'MY_TABLE') FROM dual; 'mostra 50 per la particolare colonna,' DESCRIBE MY_TABLE' mostra anche 50. Eseguito nella stessa sessione/db-client-window ovviamente. Si è già pensato a interpretare erroneamente il valore della lunghezza dei dati che contiene byte e char per una colonna varchar, ma per tutte le altre colonne si adatta. – evilive

+0

Se si tratta di una tabella VARCHAR, è necessario cercare COLUMN: CHAR_LENGTH, perché LENGTH è la lunghezza riservata in byte, che è 4 volte la lunghezza char per UTF-8 – Falco

risposta

3

È possibile che la documentazione DBD :: Oracle non sia particolarmente utile, ma si è considerato di utilizzare il codice sorgente?

Questa è la fonte per table_info() e column_info(). Entrambe le subroutine sembrano in gran parte spese per costruire istruzioni SQL.

+0

Ah grazie! Quindi 'column_info' interroga effettivamente' all_tab_columns' e non devo più preoccuparmi di chiamarlo ... speriamo che la prossima volta che penso ai link di origine io stesso :) – evilive