Dani's IT Blog

…moving from Oracle to Software Development

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

leave a comment »

Unglaublich aber wahr. Nachdem ich nun schon seit 2 Blog Einträgen von EXECUTE IMMEDIATE erzähle, werde ich nun tatsächlich auch zeigen wie man es verwendet. Kurz gesagt verwendet EXECUTE IMMEDIATE einen String als Argument, interpretiert diesen und führt in danach als Befehl aus. Dies entspricht dem EVAL, welches einigen von Shell Scripts her bekannt ist.

Wie man es verwenden kann, sieht man im folgenden Beispiel.

CONNECT t/t

SELECT table_name FROM user_tables;

DECLARE
  table_name VARCHAR2(50);
BEGIN
  table_name := 'exec_immediate_test_table';
  EXECUTE IMMEDIATE 'CREATE TABLE '||table_name||' (x NUMBER)';
END;
/

SELECT table_name FROM user_tables;

Was am Anfang vielleicht ein wenig komisch wirkt, ist die Tatsache, dass der String weder mit Semikolon noch mit Slash abgeschlossen wird. Diese Zeichen werden von Oracle benötigt um zu wissen, wann ein Statement abgeschlossen ist. EXECUTE IMMEDIATE verwendet aber einen String als Argument, somit ist klar, dass das Ende des Strings auch das Ende des Statements ist. Deshalb wird keine Semikolon oder Slash benötigt.

Mit dem Erlernten können wir jetzt alle Tabellen eines Schemas löschen.

connect t/t;
SELECT table_name FROM user_tables;
SET SERVEROUTPUT ON

BEGIN
  FOR tables IN (SELECT 'DROP TABLE "'|| table_name ||'"' drop_statement FROM user_tables)
  LOOP
     --output to see what's going on
     dbms_output.put_line(tables.drop_statement);
     --execute the drop table statement
     EXECUTE IMMEDIATE tables.drop_statement;
  END LOOP;
END;
/

SELECT table_name FROM user_tables;

Um meinen Code in ihrer TEST Datenbank laufen zu lassen, erstellen Sie bitte vorgänig das Testschema, welches mit dem Code aus dem ersten Teil dieser Serie erstellt werden kann.

Advertisements

Written by danirey

June 22, 2009 at 17:00

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: