JNT Visual - Fotolia

Oracle-Datenbank: So rufen Sie Stored Procedures auf

Datenbank-Experte Brian Peasland erklärt, wie man innerhalb von benutzerdefinierten Funktionen in Oracle-Databanken eine Stored Procedure aufruft.

Warum können wir eine Stored Procedure (gespeicherte Prozedur) nicht innerhalb von benutzerdefinierten Funktionen in der Oracle-Datenbank aufrufen? Lassen sich Tabellen innerhalb von Triggern generieren?

Sie können eine Stored Procedure innerhalb einer benutzerdefinierten Funktion in Oracle-Datenbanken aufrufen. Betrachten Sie dazu folgendes Beispiel:

SQL> create table test_tab (tab_id number);

Table created.

SQL> insert into test_tab values (10);

1 row created.

SQL>  insert into test_tab values (20);

1 row created.

SQL> commit;

SQL> create table test_tab_audit (tab_id number, aud_date date);

Table created.

SQL> create or replace procedure test_proc (id number)

  2  as

  3  begin

  4     null;

  5  end;

  6  /

Procedure created.

SQL> create or replace function test_fn(v_id number)

  2  return number

  3  as

  4  begin

  5     test_proc(v_id);

  6     return v_id+1;

  7  end;

  8  /

Function created.

SQL> select tab_id,test_fn(tab_id) from test_tab;

    TAB_ID TEST_FN(TAB_ID)

---------- ---------------

        10              11

        20              21

Nun sind Sie leider ziemlich eingeschränkt, was Sie mit dieser Prozedur anstellen können, die von der Funktion aufgerufen wurde. Diese Funktion wird von einer SELECT-Anweisung aufgerufen. Sie können keine Data Manipulation Language (DML) oder Data Definition Language (DDL) innerhalb einer Abfrage ausführen. In diesem Fall würden Sie eine der folgenden Fehlermeldungen erhalten:

  • ORA-14551: cannot perform a DML operation inside a query (kann keine DML-Operation in einer Abfrage durchführen)
  • ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML (kann kein DML, Commit oder Rollback in einer Abfrage oder DML durchführen)

Hier eine Funktion, die eine gespeicherte Prozedur aufruft:

SQL> create or replace procedure test_proc (id number)

  2  as

  3  begin

  4     insert into test_tab_audit values (id,sysdate);

  5     commit;

  6  end;

  7  /

Procedure created.

SQL> declare

  2     val number;

  3  begin

  4     val:=test_fn(10);

  5  end;

  6  /

PL/SQL procedure successfully completed.

SQL> select * from test_tab_audit;

    TAB_ID AUD_DATE

---------- ---------

        10 30-JUL-15

Was Ihre Frage über das Erstellen von Tabellen innerhalb von Triggern betrifft: Ja, Sie können das machen. Verwenden Sie hierfür den EXECUTE IMMEDIATE Befehl:

SQL> CREATE TRIGGER test_tab_trigger

  2  BEFORE INSERT ON test_tab

  3  FOR EACH ROW

  4  BEGIN

  5     EXECUTE IMMEDIATE 'create table another table (id number)';

  6  END;

  7  /

Trigger created.

Aber die bessere Frage ist: Sollten Sie tatsächlich eine Tabelle in einem Trigger erstellen? Normalerweise ist es eine schlechte Idee, eine Tabelle dynamisch zu erzeugen. Die Tabellen in Ihren Anwendungen sollten vorher erstellt werden. Darüber hinaus wird jedes INSERT, UPDATE oder DELETE, das bewirkt, dass der Trigger funktioniert, eine längere Zeit brauchen, bis es fertig ist. Denn Sie müssen warten, bis die Tabelle erzeugt wurde, bevor der DML-Befehl abgeschlossen ist. Normalerweise ist es eine schlechte Idee, so etwas in einem Trigger zu codieren.

Folgen Sie SearchEnterpriseSoftware.de auch auf Twitter, Google+ und Facebook!

Erfahren Sie mehr über Datenbanken