CALL-Anweisung

Die CALL-Anweisung ruft eine Routine auf.

SYNTAX

Die CALL-Anweisung verwenden

Die CALL-Anweisung ruft eine Routine auf. Eine Routine ist eine benutzerdefinierte Funktion oder Prozedur, die durch eines der folgenden Elemente definiert ist:
  • eine CREATE FUNCTION-Anweisung
  • eine CREATE PROCEDURE-Anweisung
Anmerkung: Wie bei benutzerdefinierten Funktionen und Prozeduren auch, können Sie mit der CALL-Anweisung integrierte (vom Broker bereitgestellte) Funktionen und benutzerdefinierte SQL-Funktionen aufrufen. Für gewöhnlich werden diese Funktionen aufgerufen, indem Sie lediglich ihre jeweiligen Namen in Ausdrücken einschließen.

Die aufgerufene Routine muss in Einklang mit ihrer Definition aufgerufen werden. Wenn z. B. eine Routine mit drei Parametern definiert wurde, von denen die ersten beiden eine Ganzzahl und die dritte ein Zeichen ist, muss die CALL-Anweisung drei Variablen an die Routine weiterleiten. Dabei muss der jeweilige Datentyp der Definition entsprechen. Dieser Vorgang wird genauer Signaturabgleich genannt, d. h., die Signatur der CALL-Anweisung muss mit der Signatur der Routinendefinition übereinstimmen.

Der genaue Signaturabgleich wird auch auf den Rückgabewert einer Routine angewendet. Wenn die RETURNS-Klausel in der CREATE FUNCTION-Anweisung angegeben ist oder wenn es sich bei der Routine um eine integrierte Funktion handelt, muss die INTO-Klausel in der CALL-Anweisung angegeben werden. Rückgabewerte von Routinen können nicht ignoriert werden. Umgekehrt gilt: wenn die RETURNS-Klausel nicht in der CREATE FUNCTION-Anweisung angegeben ist, muss die INTO-Klausel nicht angegeben werden, da kein Rückgabewert der Routine vorliegt.

Mit der CALL-Anweisung können Sie eine Routine aufrufen, die auf eine der folgenden Arten implementiert wurde:
  • ESQL.
  • Java.
  • Als gespeicherte Prozedur in einer Datenbank.
  • Als integrierte (vom Broker bereitgestellte) Funktion. (Beachten Sie jedoch den Hinweis oben zum Aufrufen integrierter Funktionen.)

Diese Vielfalt der Implementierungsmöglichkeiten bedeutet, dass einige der Klauseln im CALL-Syntaxdiagramm nicht für alle Routinetypen zutreffen (oder nicht zulässig sind). Zudem ermöglicht sie der CALL-Anweisung, jeden beliebigen Routinetyp - unabhängig davon, wie die Routine definiert wurde - aufzurufen.

Wenn der optionale Brokerschemaname-Parameter nicht angegeben ist, sucht der SQL-Parser des Brokers mit dem in der PATH-Anweisung beschriebenen Algorithmus nach der genannten Prozedur (siehe PATH-Klausel der BROKER SCHEMA-Anweisung).

Wenn der Brokerschemaname-Parameter angegeben ist, ruft der SQL-Parser des Brokers die genannte Prozedur im angegebenen Schema auf, ohne zuerst nach dem Pfad zu suchen. Ist die Prozedurreferenz jedoch mehrdeutig (d. h. es gibt zwei Prozeduren mit identischem Namen in unterschiedlichen Broker-Schemas) und die Referenz wird nicht vom optionalen Brokerschemaname-Parameter angegeben, generiert das Eclipse-Toolset einen "Tasksanzeigefehler", den Sie korrigieren müssen, um den mehrdeutigen Code zu implementieren.

Die vom Broker bereitgestellten integrierten Funktionen werden automatisch in ein vordefiniertes Broker-Schema namens SQL platziert. Das SQL-Schema wird stets zuletzt nach einer Routine durchsucht, die nicht mit einer benutzerdefinierten Routine abgeglichen wurde. Daher hat ein benutzerdefiniertes Modul Vorrang vor einer integrierten Routine desselben Namens.

Jedes Broker-Schema besitzt ein eindeutiges Symbol oder Namespace für eine Routine, so dass ein Routinename eindeutig ist, wenn er von dem Namen des Schemas angegeben wird, dem er angehört.

Mit der INTO-Klausel speichern Sie den Rückgabewert einer Routine, die mit einer RETURNS-Klausel definiert wurde, oder von einer integrierten Funktion. Das Ziel kann eine ESQL-Variable mit einem Datentyp sein, der dem Datentyp in der RETURNS-Klausel oder einer punktgetrennten Nachrichtenreferenz entspricht. Beispielsweise sind beide folgenden ESQL-Anweisungen gültig:
        CALL myProc1() INTO cursor;
        CALL myProc1() INTO OutputRoot.XML.TestValue1; 

Die CALL-Anweisung übergibt die Parameter in der angegebenen Reihenfolge an die Prozedur. Parameter, die in der Routinendefinition als IN oder INOUT festgelegt sind, werden vor Ausführung der CALL-Anweisung bewertet. Parameter, die als OUT definiert wurden, werden jedoch stets als NULL-Parameter des richtigen Typs eingegeben. Wenn die Prozedur vollständig ausgeführt wurde, werden alle Parameter aktualisiert, die als OUT oder INOUT deklariert wurden, um alle Änderungen zu übernehmen, die bei der Ausführung der Prozedur an ihnen vorgenommen wurden. Als IN definierte Parameter werden während der Ausführung einer Prozedur nie geändert.

Routinenüberladung wird nicht unterstützt. Sie können also nicht zwei Routinen mit identischem Namen in demselben Brokerschema erstellen. Wenn der Broker eine überlappende Routine findet, wird eine Ausnahme ausgegeben. Gleichermaßen können Sie auch keine in einer Datenbank gespeicherte Prozedur aufrufen, die überladen wurde. Eine in einer Datenbank gespeicherte Prozedur ist überladen, wenn eine andere Prozedur mit identischem Namen im selben Datenbankschema existiert. Sie können jedoch eine überladene Java-Methode aufrufen, solange Sie eine separate ESQL-Definition für jede überladene Methode erstellen, die Sie aufrufen möchten, und jeder ESQL-Definition einen eindeutigen Namen geben.

Zugehörige Konzepte
Übersicht zu ESQL
Zugehörige Tasks
ESQL erstellen
Gespeicherte Prozeduren aufrufen
Zugehörige Verweise
Syntaxdiagramme: verfügbare Typen
ESQL-Anweisungen
CREATE PROCEDURE-Anweisung
BROKER SCHEMA-Anweisung
PATH-Klausel
Bemerkungen | Marken | Downloads | Bibliothek | Unterstützung | Rückmeldung
Copyright IBM Corporation 1999, 2006 Letzte Aktualisierung: 23. Aug. 2006
ak04920_