|
Geschrieben von: Martin Bulinski
|
|
Donnerstag, 13. November 2008 um 15:53 |
|
In anderen Datenbankprodukten stehen Dump-Kommandos zur Verfügung, um Dateninhalte aus bestehenden Tabellen in einem technischen, weiter verarbeitbaren Format aus der Datenbank zu extrahieren. Unter ORACLE sucht man vergeblich. Selbst ist der Mann/die Frau und greift zu PL/SQL-Mitteln…
Eine Kurzbeschreibung des folgenden Codes: Ich nutze einen REF CURSOR, um das Select entsprechend dem Aufbau der übergebenen Tabelle zusammenzusetzen und auszuführen. Dazu schaue ich in die Tabelle USER_TAB_COLUMNS, um die Spalten der Tabelle zu ermitteln und baue einen String in der Variable STMT zusammen, der alle Spalten durch Semikolon getrennt selektiert. Dann wird dieses Statement ausgeführt. Da es sich im Select um genau einen Ausdruck handelt, kann der schön in die Variable helper gefetcht werden und wird am Bildschirm präsentiert. create or replace procedure sqldump (tabname varchar2) is
type myreftype is ref cursor;
mycur myreftype;
helper varchar2(2000);
stmt varchar2(2000) := 'SELECT ';
begin
for rec in (select column_name from user_Tab_columns
where table_name = upper(tabname)) loop
stmt:= stmt ||rec.column_name||'||'';''||';
end loop;
stmt:= stmt ||''''' from '||tabname;
open mycur for stmt ;
loop
fetch mycur into helper;
exit when mycur%NOTFOUND;
dbms_output.put_line(helper);
end loop;
close mycur;
end;
/
SQL> set serveroutput on
SQL> exec sqldump('EMP')
7369;SMITH;CLERK;7902;17.12.80;800;;20;
7499;ALLEN;SALESMAN;7698;20.02.81;1600;300;30;
7521;WARD;SALESMAN;7698;22.02.81;1250;500;30;
7566;JONES;MANAGER;7839;02.04.81;2975;;20;
7654;MARTIN;SALESMAN;7698;28.09.81;1250;1400;30;
7698;BLAKE;MANAGER;7839;01.05.81;2850;;30;
7782;CLARK;MANAGER;7839;09.06.81;2450;;10;
7788;SCOTT;ANALYST;7566;19.04.87;3000;;20;
7839;KING;PRESIDENT;;17.11.81;5000;;10;
7844;TURNER;SALESMAN;7698;08.09.81;1500;0;30;
7876;ADAMS;CLERK;7788;23.05.87;1100;;20;
7900;JAMES;CLERK;7698;03.12.81;950;;30;
7902;FORD;ANALYST;7566;03.12.81;3000;;20;
7934;MILLER;CLERK;7782;23.01.82;1300;;10;
PL/SQL-Prozedur erfolgreich abgeschlossen.
Wo sind die Grenzen dieses Codes, was kann man besser machen
- derzeit kann man nur seine eigenen Tabellen dumpen
- Character-Spalten werden ohne umschliessende Hochkomma ausgegeben, wie alle anderen Datentypen auch
- es werden nur die Daten gedumpt, nicht vollständige SQL-Statements zum anschliessenden Wiedereinfügen
- NULL-Werte werden “leer” gedumpt, also als zwei aufeinanderfolgende Semikola
- Das Trennzeichen ist nicht flexibel wählbar, wenn in einem String ein Semikolon vorkommt, wird dieses nicht escaped
Ich bau demnächst was besseres…
|