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).
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
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
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