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