Funktionsauswahl

Sowohl für qualifizierte als auch für nicht qualifizierte Funktionsreferenzen prüft der Funktionsauswahlalgorithmus alle anwendbaren Funktionen, sowohl integrierte als auch benutzerdefinierte, die Folgendes aufweisen: den angegebenen Namen, dieselbe Anzahl definierter Parameter als Argumente in der Funktionsreferenz und jeden Parameter, der mit dem Typ des entsprechenden Arguments identisch oder hochstufbar ist.

Anwendbare Funktionen sind Funktionen im benannten Schema für eine qualifizierte Referenz oder Funktionen in den Schemata des SQL-Pfads für eine nicht qualifizierte Referenz. Der Algorithmus sucht nach einer exakten Übereinstimmung oder nach einer fehlerhaften Übereinstimmung zwischen diesen Funktionen. Der SQL-Pfad wird nur bei einer nicht qualifizierten Referenz als Entscheidungsfaktor verwendet, wenn zwei identisch gute Übereinstimmungen in verschiedenen Schemas gefunden werden.

Ausnahme: Wenn es einen nicht qualifizierten Verweis auf eine Funktion mit dem Namen RID gibt und die Funktion mit einem einzigen Argument aufgerufen wird, das mit einem Tabellenverweis in der FROM-Klausel der Unterauswahl übereinstimmt, ist das Schema SYSIBM und die integrierte RID-Funktion wird aufgerufen.

Sie können Funktionsreferenzen verschachteln, sogar Verweise auf dieselbe Funktion. Dies gilt im Allgemeinen für integrierte Funktionen und UDFs. Es gibt jedoch einige Einschränkungen, wenn Spaltenfunktionen beteiligt sind.

Beispiel:
     CREATE FUNCTION BLOOP (INTEGER) RETURNS INTEGER ... 
     CREATE FUNCTION BLOOP (DOUBLE) RETURNS INTEGER ...
Betrachten Sie nun die folgende DML-Anweisung:
     SELECT BLOOP( BLOOP(COLUMN1)) FROM T

Wenn in dieser Anweisung column1 eine DECIMAL-oder DOUBLE-Spalte ist, wird die innere BLOOP-Referenz in die zweite BLOOP aufgelöst. Da dieser BLOOP einen INTEGER zurückgibt, wird der äußere BLOOP in den ersten BLOOP aufgelöst.

Wenn in dieser DML-Anweisung column1 eine SMALLINT-oder INTEGER-Spalte ist, wird der innere Bloopverweis in den ersten BLOOP aufgelöst. Da dieser BLOOP einen INTEGER zurückgibt, wird auch der äußere BLOOP in den ersten BLOOP aufgelöst. In diesem Fall werden verschachtelte Verweise auf dieselbe Funktion angezeigt.

Wenn Sie eine Funktion mit dem Namen eines der SQL-Operatoren definieren, können Sie eine UDF mit der Infixnotationaufrufen. Angenommen, Sie können dem Operator "+" eine Bedeutung für Werte mit dem einzigartigen Datentyp BOAT zuordnen. Sie können die folgende UDF definieren:
     CREATE FUNCTION "+" (BOAT, BOAT) RETURNS ...
Anschließend können Sie die folgende gültige SQL-Anweisung schreiben:
     SELECT BOAT_COL1 + BOAT_COL2 
     FROM BIG_BOATS 
     WHERE BOAT_OWNER = 'Nelson Mattos'
Sie können aber auch die ebenso gültige Anweisung schreiben:
     SELECT "+"(BOAT_COL1, BOAT_COL2) 
     FROM BIG_BOATS 
     WHERE BOAT_OWNER = 'Nelson Mattos' 

Beachten Sie, dass Sie die integrierten Bedingungsoperatoren wie >, =, LIKE, INusw. nicht auf diese Weise überladen dürfen.

Eine ausführlichere Beschreibung der Funktionsauswahl finden Sie im Abschnitt "Funktionsreferenzen" im Thema "Funktionen" unter den zugehörigen Links.