martinbulinski.de

SQLDUMP unter Oracle Drucken E-Mail
  
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…

 
Benutzerbewertung: / 0
SchwachPerfekt 

Kommentar schreiben


Sicherheitscode
Aktualisieren

Anmeldung



Wer ist online

Wir haben 6 Gäste online