Definieren von Argumenten für UDFs und gespeicherte Prozeduren

Wenn Sie CREATE FUNCTION oder CREATE PROCEDURE ausführen, um eine Funktion bzw. Prozedur zu definieren, geben Sie die Argumente an, die übergeben werden können. Beispiel:

CREATE FUNCTION my_function(integer_argument INT, varchar_argument VARCHAR)
  ...
Copy
CREATE PROCEDURE my_procedure(boolean_argument BOOLEAN, date_argument DATE)
  ...
Copy

Wenn Sie eine Funktion oder Prozedur aufrufen, werden die Argumentwerte an die Argumente des Handlers gebunden. Diese Bindung kann auf Grundlage übereinstimmender Namen oder anhand der Position der Argumente erfolgen, je nach der für den Handler verwendeten Sprache.

Unter diesem Thema werden Richtlinien für das Angeben von Argumenten für eine Funktion bzw. Prozedur bereitgestellt.

Begrenzung der Anzahl von Eingabeargumenten

Skalare Funktionen (UDFs) haben einen Grenzwert von 500 Eingabeargumenten.

Datentypen der Argumente angeben

Wählen Sie den SQL-Datentyp, der dem Datentyp des Arguments entspricht, das Sie im Handler-Code verwenden.

Weitere Informationen zum Zuordnen von SQL-Datentypen zu Handler-Datentypen in Snowflake finden Sie unter Zuordnung von Datentypen zwischen SQL und Handler-Sprachen.

Argument Session bei Java-, Python- und Scala-Prozeduren weglassen

Lassen Sie in der CREATE PROCEDURE-Anweisung für eine in Java, Python oder Scala geschriebene Prozedur das Argument für das Snowpark-Session-Objekt weg.

Angenommen, Ihr Handler-Code übergibt ein Session-Objekt und ein String-Objekt:

public String queryTable(Session session, String tableName) { ... }
Copy

In der CREATE PROCEDURE-Anweisung definieren Sie kein Argument für das Session-Objekt. Definieren Sie stattdessen nur ein Argument für die Eingabezeichenfolge:

CREATE OR REPLACE PROCEDURE query_table(table_name VARCHAR)
  ...
Copy

Session ist ein implizites Argument, das Sie beim Aufrufen der Prozedur nicht angeben. Wenn Sie Ihre gespeicherte Prozedur zur Laufzeit aufrufen, erstellt Snowflake ein Session-Objekt und übergibt dieses an Ihre gespeicherte Prozedur.

Optionale Argumente angeben

Sie können angeben, dass ein Argument optional ist. Weitere Details dazu finden Sie im nächsten Abschnitt:

Kennzeichnen eines Arguments als optional

Wenn Sie möchten, dass ein Argument optional ist, verwenden Sie das Schlüsselwort DEFAULT, um den Standardwert für das Argument anzugeben. Beispiel:

CREATE OR REPLACE FUNCTION build_string_udf(
    word VARCHAR,
    prefix VARCHAR DEFAULT 'pre-',
    suffix VARCHAR DEFAULT '-post'
  )
  ...
Copy
CREATE OR REPLACE PROCEDURE build_string_proc(
    word VARCHAR,
    prefix VARCHAR DEFAULT 'pre-',
    suffix VARCHAR DEFAULT '-post'
  )
  ...
Copy

Für den Standardwert des Arguments können Sie einen Ausdruck verwenden. Beispiel:

CREATE OR REPLACE FUNCTION my_date_udf(optional_date_arg DATE DEFAULT CURRENT_DATE())
  ...
Copy

Sie müssen optionale Argumente nach den erforderlichen Argumenten (falls vorhanden) positionieren. Sie können ein optionales Argument nicht vor einem erforderlichen Argument positionieren.

-- This is not allowed.
CREATE FUNCTION wrong_order(optional_argument INTEGER DEFAULT 0, required_argument INTEGER)
  ...
Copy

Überladen von Funktionen und Prozeduren mit optionalen Argumenten

Wenn Sie eine Funktion oder Prozedur überladen, können Sie kein optionales Argument verwenden, um zwischen verschiedenen Signaturen zu unterscheiden. Angenommen, Sie erstellen die folgende UDF, die keine Argumente übergibt:

CREATE FUNCTION my_udf_a()
  ...
Copy

Wenn Sie versuchen, eine UDF mit demselben Namen zu erstellen, die ein optionales Argument enthält, schlägt die Anweisung CREATE FUNCTION fehl:

CREATE FUNCTION my_udf_a(optional_arg INTEGER DEFAULT 0)
  ...
Copy
000949 (42723): SQL compilation error:
  Cannot overload FUNCTION 'MY_UDF_A' as it would cause ambiguous FUNCTION overloading.

Ein weiteres Beispiel: Angenommen, Sie erstellen eine UDF, die ein erforderliches INTEGER-Argument übergibt:

CREATE FUNCTION my_udf_b(required_arg INTEGER)
  ...
Copy

Wenn Sie versuchen, eine UDF mit demselben Namen zu erstellen, die ein erforderliches INTEGER-Argument und ein optionales Argument übergibt, schlägt die Anweisung CREATE FUNCTION fehl:

CREATE FUNCTION my_udf_b(required_arg INTEGER, optional_arg INTEGER DEFAULT 0)
  ...
Copy
000949 (42723): SQL compilation error:
  Cannot overload FUNCTION 'MY_UDF_B' as it would cause ambiguous FUNCTION overloading.

Dies betrifft auch Fälle, in denen Sie ALTER FUNCTION… RENAME oder ALTER PROCEDURE… RENAME verwenden, um eine Funktion oder Prozedur umzubenennen. Wenn Sie eine Funktion oder Prozedur umbenennen möchten, darf es keine bestehende Funktion mit demselben Namen und derselben Signatur geben. Optionale Argumente unterscheiden eine Signatur nicht von einer anderen.

Angenommen, Sie erstellen eine UDF mit dem Namen abc_udf, die ein erforderliches INTEGER-Argument übergibt:

CREATE FUNCTION abc_udf(required_arg INTEGER)
  ...
Copy

Angenommen, Sie erstellen eine UDF mit einem anderen Namen (def_udf), die ein erforderliches INTEGER-Argument und ein optionales Argument übergibt:

CREATE FUNCTION def_udf(required_arg INTEGER, optional_arg INTEGER DEFAULT 0)
  ...
Copy

Wenn Sie versuchen, den Namen von def_udf in abc_udf zu ändern, tritt ein Fehler auf, weil es bereits eine UDF mit demselben Namen und denselben Typen von erforderlichen Argumenten hat:

000949 (42723): SQL compilation error:
  Cannot overload FUNCTION 'ABC_UDF' as it would cause ambiguous FUNCTION overloading.

Aufrufen von Funktionen und Prozeduren, die optionale Argumente haben

Weitere Informationen zum Aufrufen von Funktionen und Prozeduren, die optionale Argumente haben, finden Sie unter: