PL-SQL: Prozedur
Das Buch PL-SQL wird zurzeit überarbeitet! Änderungen an dieser Seite bitte nur in Absprache mit mir.
Einstieg
BearbeitenProzeduren 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
BearbeitenWenn 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.