2015-01-21 6 views
5

Ich habe eine (zumindest dachte ich so) einfache Aufgabe: Vergleiche 2 Tabellen nach Spaltennamen, Datentypen und Länge nur um zu überprüfen, ob sie die gleiche Struktur bis jetzt haben. Dies sollte in einem vorhandenen Perl-Skript geschehen, das eine Verbindung zu zwei verschiedenen Datenbanken herstellt.Woher erhalten perls dbi: Oracle table_info/column_info ihre Informationen?

Zuerst habe ich einfach jede Datenbank user_tab_columns abgefragt und das Ergebnis verglichen. Jetzt habe ich den harten Weg herausgefunden, dass user_tab_columns nicht live ist, aber durch die Analyse der Tabelle (http://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_4462.htm#REFRN26277) aktualisiert werden muss, von der ich absolut keine Ahnung hatte.

describe bekommt die eigentliche Tabellendefinition, scheint aber perls nicht zu funktionieren dbi: Oracle, also stolperte ich über die Methoden table_info() und column_info(). Woher bekommen sie ihre Informationen? Wenn sie nur *_tab_columns abfragen, sind sie für mich nicht von Nutzen.

Ich kann nicht einfach testen, weil ich noch nicht die richtigen Parameter übergeben habe. Die Dbi Documentation sagt, es ist nach dem Datenbanktreiber. Die Oracle DBD Documentation war mir auch nicht sehr hilfreich, Versuch und Irrtum führten bis jetzt dazu, dass alle Objekte oder gar nichts gefunden wurden.

Im Moment des Ich denke describe über sqlplus durch einen Perl-Systemaufruf ausführen und die Ausgabe Parsen .... aber es hat ein besserer Weg zu sein.

EDIT:

Der Blick user_tab_columns funktioniert wie erwartet, wenn die richtigen Spalten überprüft (siehe Kommentar unten).

+0

Ich denke, Sie haben etwas aus der Dokumentation missverstanden! user_columns ist eine Tabelle, die immer 100% aktuell ist - mit ANALYZE ändern sich nur die Spalten, die statistische Daten enthalten. Aber Spalten wie Name, Typ ... sind immer genau wie DESCRIBE – Falco

+0

Hm das ist, was ich auch dachte, aber: 'wählen column_name, data_type, data_length aus user_tab_columns wobei table_name = 'MY_TABLE' und column_name = 'MY_COLUMN';' gibt mir eine Datenlänge von 200. SELECT dbms_metadata.get_ddl ('TABLE', 'MY_TABLE') FROM dual; 'zeigt 50 für die jeweilige Spalte,' DESCRIBE MY_TABLE' zeigt ebenfalls 50. Wird natürlich in derselben Session/im selben db-client-window ausgeführt. Wir haben bereits darüber nachgedacht, den Datenlängenwert für Bytes und Zeichen für eine Varchar-Spalte falsch zu interpretieren, aber für alle anderen Spalten passt er. – evilive

+0

Wenn es sich um eine VARCHAR-Tabelle handelt, müssen Sie nach COLUMN suchen: CHAR_LENGTH, da LENGTH die reservierte Länge in Byte ist, die 4 Mal die Zeichenlänge für UTF-8 ist. – Falco

Antwort

3

Sie haben die Dokumentation zu DBD :: Oracle möglicherweise nicht besonders hilfreich gefunden, aber haben Sie den Quellcode in Betracht gezogen?

Hier ist die Quelle für table_info() und column_info(). Beide Subroutinen scheinen weitgehend für den Aufbau von SQL-Anweisungen verwendet zu werden.

+0

Ah danke! Also fragt 'column_info' tatsächlich nach' all_tab_columns' und ich muss mir keine Sorgen mehr machen, wenn ich es anrufe ... hoffentlich denke ich nächstes Mal an die Source-Links selbst :) – evilive

Verwandte Themen