Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

CALL - Prozedur ausführen

CALL führt eine Prozedur aus. CALL kann auch innerhalb einer Routine zur Ausführung einer anderen Prozedur verwendet werden (geschachtelte Aufrufe von Routinen),

Die CALL-Anweisung ist eine nicht-atomare SQL-Anweisung, da in der gerufenen Prozedur nicht-atomare Anweisungen enthalten sein können.

Prozeduren und ihre Verwendung in SESAM/SQL sind detailliert im Kapitel „Routinen" beschrieben.

Welche Routinen definiert sind und welche Routinen einander verwenden, erfahren Sie in den Views für Routinen des INFORMATION_SCHEMA (siehe Kapitel „Informationsschemata").

Wenn eine Prozedur Eingabeparameter erwartet, dann müssen die entsprechenden Werte (die Argumente) in der CALL-Anweisung an die Prozedur übergeben werden.

Ausgabewerte von Prozeduren, die außerhalb einer Routine aufgerufen werden, werden in entsprechenden Benutzervariablen oder im SQL-Deskriptorbereich abgelegt. Ausgabewerte von Prozeduren, die in einer übergeordneten Routine aufgerufen werden, werden in Ausgabeparameter oder in lokale Variablen der übergeordneten Prozedur eingetragen.

Die Pragmas DEBUG ROUTINE, DEBUG VALUE und LOOP LIMIT können zusätzlich verwendet werden. Siehe Abschnitt „Pragmas und Annotationen".Sie werden nur interpretiert, wenn sie vor einer extern (also aus einer Anwendung) aufgerufenen CALL-Anweisung stehen und vererben ihre Wirkung dann auf alle direkt oder indirekt enthaltenen CALL-Anweisungen und User Defined Functions. Sie haben vor einer CALL-Anweisung in einer Prozedur keine Wirkung.

Pragmas zur Optimierung können auch bei einer CALL-Anweisung in einer Prozedur angegeben werden. Sie wirken sich dann auf die Optimierung der Aufrufwerte aus.

Zur Ausführung einer Prozedur benötigt der aktuelle Berechtigungsschlüssel das EXECUTE-Privileg für die auszuführende Prozedur, nicht aber diejenigen Privilegien, die benötigt werden, um die in der Prozedur enthaltenen DML-Anweisungen ausführen zu können. Zusätzlich werden die SELECT-Privilegien für die Tabellen benötigt, die in den Aufrufparametern der Routine über Unterabfragen angesprochen werden.



CALL prozedur argumente

prozedur ::= routine

argumente ::= ([ ausdruck [{, ausdruck }...]])



prozedur

Name der auszuführenden Prozedur. Der einfache Prozedurname kann durch einen Datenbank- und Schemanamen qualifiziert werden.


([ ausdruck [{, ausdruck }...]])

Liste der Argumente. Die Anzahl der Argumente muss mit der Anzahl der Parameter aus der Prozedur-Definition übereinstimmen. Die Argumente müssen in ihrer Reihenfolge mit den Parametern korrespondieren. Wenn kein Parameter für die Prozedur definiert ist, dann besteht die Liste nur aus den runden Klammern.

Wenn der n-te Parameter vom Typ IN oder INOUT ist, dann wird ihm vor Prozedur-Ausführung der Wert des n-ten Arguments zugewiesen.

Wenn der n-te Parameter vom Typ OUT oder INOUT ist, dann gilt:

    • Wenn die CALL-Anweisung statisch formuliert ist, dann muss das n-te Argument eine Benutzervariable (ggf. mit Indikatorvariable) sein.
      Dieselbe Benutzervariable darf nicht als Argument für mehrere Parameter vom Typ OUT oder INOUT verwendet werden.

    • Wenn die CALL-Anweisung dynamisch formuliert ist, dann muss das n-te Argument ein Platzhalter („?“) sein.

Nach Ausführung der Prozedur werden die Werte für die Parameter vom Typ OUT oder INOUT in die entsprechenden Benutzervariablen oder einen SQL-Deskriptorbereich übertragen.

Der Datentyp des n-ten Arguments muss mit dem Datentyp des n-ten Parameters verträglich sein. Für Eingabeparameter siehe die Hinweise im Abschnitt „Eingabeparameter für Routinen versorgen". Für Ausgabeparameter siehe Abschnitt „Werte in Prozedurparameter (Ausgabe) oder lokale Variable eintragen".

Wenn bei einer statisch formulierten SQL-Anweisung ein Parameter als Benutzervariable angegeben wird, dann geht SESAM/SQL bei der Vorübersetzung (ohne Datenbankkontakt) davon aus, dass es sich dabei um einen Parameter vom Typ IN oder IN-OUT handelt und überträgt diesen Wert an den DBH. Auch wenn es sich um einen reinen Ausgabeparameter handelt, muss daher entweder der Wert entsprechend dem Datentyp korrekt initialisiert werden oder die Benutzervariable erhält eine Indikatorvariable, die dann mit dem Wert -1 zu versorgen ist.

CALL und Transaktionssicherung

CALL leitet für Prozeduren, die außerhalb einer Routine aufgerufen werden, eine SQL-Transaktion ein, wenn keine Transaktion offen ist. Da eine Prozedur nur DML-Anweisungen enthält, wird mit CALL also eine SQL-Transaktion zur Datenmanipulation eingeleitet.

Die Prozeduranweisungen laufen im gleichen Isolationslevel und Transaktionsmodus ab wie die CALL-Anweisung (siehe Abschnitt „SET TRANSACTION - Transaktionseigenschaften festlegen").

Wenn der Transaktionsmodus READ ONLY eingestellt ist, dann darf die Prozedur keine SQL-Anweisungen zum Ändern von Daten enthalten.

CALL und Zeitfunktionen

Kommen die Zeitfunktionen CURRENT_DATE, CURRENT_TIME(3), LOCALTIME(3), CURRENT_TIMESTAMP(3) und LOCALTIMESTAMP(3) innerhalb einer Anweisung mehrmals vor, werden diese simultan ausgewertet, siehe Abschnitt „Zeitfunktionen". Diese Aussage gilt auch für Prozeduranweisungen. Dies bedeutet aber nicht, dass die Zeitfunktionen aller Anweisungen eines Prozedurablaufes simultan ausgewertet werden:

  • Die Zeitfunktionen der CALL-Anweisung werden simultan ausgewertet, wenn sie als Wert in Eingabeparametern auftreten.

  • Die Zeitfunktionen einer jeden Prozeduranweisung werden für sich simultan ausgewertet.
    Unterschiedliche Prozeduranweisungen liefern damit i.A. auch unterschiedliche Zeitwerte.

  • Die Zeitfunktionen der COMPOUND-Anweisung werden simultan ausgewertet, wenn sie als Standardwert in Variablen-Definitionen auftreten.

  • Die Zeitfunktionen einer IF-Anweisung werden für alle Suchbedingungen, sowohl im IF- wie auch im ELSIF-Zweig, simultan ausgewertet. Die Zeitfunktionen der Prozeduranweisungenin den THEN- und ELSE-Zweigen der IF-Anweisung werden aber wieder für sich simultan ausgewertet.

  • Die Zeitfunktionen in Cursor-Beschreibungen lokaler Cursor werden simultan bei der OPEN-Anweisung für den Cursor ausgewertet.


Beispiel

Die Prozedur GetCurrentYear (siehe "CREATE PROCEDURE - Prozedur erzeugen") wird aufgerufen.

CALL ProcSchema.GetCurrentYear (OUT myvar)

Siehe auch

CREATE PROCEDURE, DROP PROCEDURE