Dani's IT Blog

…moving from Oracle to Software Development

PL/SQL Basics für den DBA, Teil II (…oder wie die Arbeit als DBA Spass macht)

leave a comment »

In meinem letzten Artikel habe ich gezeigt wie das zusammensetzen von fixen Textblöcken und Daten aus der Datenbank das Leben des DBA vereinfachen können. Leider musste man mit der Lösung von letztem Mal immer noch die DDL Statements mittels Copy&Paste ausführen, oder zumindest in einer Datei auf dem Filesystem zwischenspeichern. Ich nehme mal an, bei einigen hat sich dabei die Frage gestellt: Was tue ich wenn dies nicht möglich ist?

Natürlich hat Oracle auch in diesem Fall eine Lösung für uns. Wir können uns PL/SQL und EXECUTE IMMEDIATE zu Hilfe nehmen. Letzteres ist vergleichbar mit EVAL in einem Shell Script. Bevor wir aber diese Methode verwenden, sollten einige PL/SQL Basics verstanden sein.

Es gibt zwei Möglichkeiten PL/SQL in einer Oracle Datenbank zu verwenden. Entweder speichern wir den Code in Form von Objekten wie Procedures, Functions oder Triggern oder wir verwenden einen anonymen PL/SQL Block. Falls PL/SQL AdHoc verwendet wird, drängt sich der Einsatz eines anonymen PL/SQL Block auf, wir konzentrieren uns deshalb erst Mal auf diese Technik.

DECLARE
  variable declaration;
BEGIN
  your code here;
END;
/

Ein anonymer PL/SQL Block besteht immer aus mindestens zwei Komponenten. Die Deklaration ist Optional, sie wird nur benötigt wenn Variabeln definiert werden. Setzen wir Beispielsweise folgendes Statement in sqlplus ab,

exec dbms_stats.gather_schema_stats('SCOTT');

so konvertiert sqlplus dies für uns zu

 begin dbms_stats.gather_schema_stats('SCOTT'); end;
 /

Dabei haben wir direkt 4 verschiedene Dinge gelernt. DECLARE ist Optional, PL/SQL ist NICHT Case Sensitiv (Gross- und Kleinschreibung spielt keine Rolle), wir können ohne Probleme Einzeiler schreiben mit PL/SQL und EXEC ist nur ein sqlplus Befehl welcher in einen anonymen PL/SQL Block übersetzt wird.

Wenn man eine neue Programmiersprache lernt, so ist das erste im Normalfall ein ‘Hello World!’ Programm. Mit PL/SQL kann dies wie folgt implementiert werden.

BEGIN
  dbms_output.put_line('Hello World!');
END;
/

Hier geht nun das Drama los. Die meisten werden es nicht realisiert haben, aber diese Ausgabe wird nicht direkt auf dem Bildschirm angezeigt. Statt dessen landet die Ausgabe als Erstes in einem Buffer, welcher vom Client ausgelesen werden muss. Abhängig von der Implementation des Clients geschieht dies automatisch, oder eben nicht. Hinzu kommt, dass dies abhängig vom Client während oder erst nach der Ausführung eines PL/SQL Blocks geschieht. Leider liest sqlplus den Buffer standardmässig gar nicht aus und kann ihn auch nicht während der Ausführung eines PL/SQL Blocks auslesen. Um sqlplus den Buffer auslesen zu lassen, muss der Parameter SERVEROUTPUT auf ON gesetzt werden.

SET SERVEROUTPUT ON

Advertisements

Written by danirey

June 9, 2009 at 18:48

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: