Das Buch PL-SQL wird zurzeit überarbeitet! Änderungen an dieser Seite bitte nur in Absprache mit mir.

Einstieg Bearbeiten

Prozeduren sind nützlich, um regelmäßig wiederkehrende Arbeitsabläufe zu automatisieren z.B. um Installationsarbeiten durchzuführen.

Als Einstieg soll eine Prozedur dienen, die nur aus zwei Befehlen besteht.

CREATE OR REPLACE PROCEDURE spins IS
BEGIN
   INSERT INTO tdept (deptno, deptname, mgrno, admrdept)
   VALUES ('A00', 'SPIFFY COMPUTER DIV.', '000010', 'A00');
   INSERT INTO tdept (deptno, deptname, mgrno, admrdept)
   VALUES ('B01', 'PLANNING            ', '000020', 'A00');
END;
/

Die Procedur wird im SQLPLUS aufgerufen mit dem Befehl:

EXECUTE spins; 

Innerhalb eines PL/SQL-Scripts wird die Procedur nur durch Angabe ihres Namens aufgefufen.

BEGIN
   spins;
END;
/

Parameterübergabe Bearbeiten

Wenn man der Prozedur Parameter übergeben will, dann wird unterschieden in:

  • IN: Die aufrufende Umgebung übergibt einen Wert an die Prozedur. Dieser Parameter kann innerhalb der Verarbeitung nicht verändert werden. IN ist der default Parameter-Modus
  • OUT: Die aufrufende Umgebung übergibt eine Variable an die Prozedur, die innerhalb der Prozedur als nicht initialisiert betrachtet wird. Wenn innerhalb der Verarbeitung diesem Parameter ein Wert zugewiesen wird, dann wird dieser an die aufrufende Umgebung zurückgegeben.
  • IN OUT: Die Aufrufende Umgebung übergibt eine Variable an die Prozedur. Diese kann innerhalb der Prozedur verwendet werden und auch geändert werden. Der geänderte Wert wird der aufrufenden Umgebung mitgeteilt.


Einfache Prozedur, die einen Parameter übergeben bekommt. Dieser Parameter wird durch den Befehl put_line wieder ausgegeben. Um die Ausgabe zu aktivieren, muss erst der SQL*Plus - Befehl 'set serveroutput on' ausgeführt werden.

set serveroutput on
CREATE OR REPLACE PROCEDURE myfirstproc(v IN VARCHAR2)
IS
BEGIN
   dbms_output.put_line(v);
END;
/

Es ist auch möglich, Werte von Prozeduren verändern zu lassen:

CREATE OR REPLACE PROCEDURE mysecondproc(param1 IN OUT NUMBER)
IS
BEGIN
   Param1 := Param1 + 42;
END;
/

Wird dieses zweite Beispiel verwendet, liefert der entsprechende Test:

set serveroutput on
DECLARE
  x NUMBER := 13;
BEGIN
   DBMS_OUTPUT.PUT_LINE( x );
   mysecondproc( x );
   DBMS_OUTPUT.PUT_LINE( x );
END;
/

wie zu erwarten, werden die Werte 13 und 55 ausgegeben.