Dani's IT Blog

…moving from Oracle to Software Development

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

leave a comment »

In den letzen zwei Posts habe ich einige SQL und PL/SQL basics präsentiert. Jetzt können wir einen Schritt weiter gehen und das Erlernte kombinieren, dadurch erhalten wir ein nützliches Werkzeug für die tägliche Arbeit als DBA.
Das Hauptziel ist es immer noch ein Tool zu erhalten mit dessen Hilfe wir mehrere Objekte in einem Schritt verändern können, ohne dass wir Befehle kopieren- oder ein generiertes Script ausführen müssen. Um das zu ermöglichen müssen wir noch CURSOR, LOOP und EXECUTE IMMEDIATE kennen lernen. Wenn wir CURSOR, LOOP und EXECUTE IMMEDIATE mit dem KnowHow aus Teil 1 und 2 kombinieren, können wir unser Ziel erreichen.

Die einfachste Möglichkeit einen Loop zu schreiben und einen Cursor auszulesen, ist das Verwenden eines impliziten Cursors. Das könnte etwa wie folgt aussehen.

BEGIN
FOR object IN (SELECT object_name, owner, object_type FROM dba_objects WHERE rownum <= 10) LOOP dbms_output.put_line('object '||object.owner||'.'||object.object_name||' is of type '||object.object_type); END LOOP; END; / [/sourcecode] Dieser Loop funktioniert ähnlich wie ein Iterator in Java, Perl und vielen anderen Programmiersprachen. Aber was ist mit dem versprochenen Cursor, der ist ja nirgends definiert?! Das muss er auch nicht, Oracle ist so freundlich und erstellt ihn für uns. Deshalb spricht man auch von einem impliziten Cursor. Mit einem expliziten Cursor würde der selbe Code etwa wie folgt aussehen. [sourcecode language='sql'] DECLARE CURSOR cObject IS SELECT object_name, owner, object_type FROM dba_objects WHERE rownum <= 10; vOwner dba_objects.owner%TYPE; vObjectName dba_objects.object_name%TYPE; vObjectType dba_objects.object_type%TYPE; BEGIN OPEN cObject; LOOP FETCH cObject INTO vObjectName, vOwner, vObjectType; EXIT WHEN cObject%NOTFOUND; dbms_output.put_line('object '||vOwner||'.'||vObjectName||' is of type '||vObjectType); END LOOP; CLOSE cObject; END; / [/sourcecode] Wie wir sehen können erhalten wir dadurch einiges an zusätzlichen Code. Für uns bedeutet das, dass wir in den meisten Fällen einen impliziten Cursor verwenden können, da dieser viel einfacher zu schreiben ist. Ich werde aber in späteren Posts noch Situationen zeigen, in denen ein expliziter Cursor benötigt wird und werde auch noch auf eine noch komplexere Schreibweise zu sprechen kommen, bei welcher auf PARSE, EXECUTE und FETCH separat ausgeführt und definiert werden.

Advertisements

Written by danirey

June 16, 2009 at 18:45

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: