Schreiben von gespeicherten Prozeduren in Java

Dieses Feature ermöglicht das Schreiben von gespeicherten Prozeduren in Java. Sie können die Snowpark-Bibliothek innerhalb Ihrer gespeicherten Prozedur verwenden, um Abfragen, Aktualisierungen und andere Arbeiten an Tabellen in Snowflake auszuführen.

In diesem Thema wird erläutert, wie Sie den Handler für eine gespeicherte Prozedur schreiben, der ihre Logik enthält. Sobald die Logik verfügbar ist, können Sie die Prozedur mit SQL erstellen und aufrufen. Weitere Informationen dazu finden Sie unter Erstellen einer gespeicherten Prozedur und Aufrufen einer gespeicherten Prozedur.

Unter diesem Thema:

Einführung

Mit gespeicherten Snowpark-Prozeduren können Sie Ihre Datenpipeline in Snowflake erstellen und ausführen, wobei ein Snowflake-Warehouse als Compute-Framework dient. Für den Code Ihrer Datenpipeline verwenden Sie die Snowpark-API für Java zum Schreiben der gespeicherten Prozeduren. Um die Ausführung dieser gespeicherten Prozeduren zu planen, verwenden Sie Aufgaben (Tasks).

Sie können während der Ausführung Ihres Handler-Codes Protokoll- und Ablaufverfolgungsdaten erfassen. Weitere Informationen dazu finden Sie unter Übersicht zu Protokollierung und Ablaufverfolgung.

Bemerkung

Um eine anonyme Prozedur sowohl zu erstellen als auch aufzurufen, verwenden Sie CALL (mit anonymen Prozeduren). Das Erstellen und Aufrufen einer anonymen Prozedur erfordert keine Rolle mit CREATE PROCEDURE-Schemaberechtigungen.

Voraussetzungen

Sie müssen Version 1.3.0 oder eine neuere Version der Snowpark-Bibliothek verwenden.

Wenn Sie eine gespeicherte Prozedur schreiben, müssen Sie Ihre Klassen für die Ausführung in Java, Version 11.x kompilieren.

Einrichten Ihrer Entwicklungsumgebung für Snowpark

Richten Sie Ihre Entwicklungsumgebung für die Verwendung der Snowpark-Bibliothek ein. Siehe Einrichten Ihrer Entwicklungsumgebung für Snowpark Java.

Strukturieren und Erstellen von Handler-Code

Sie können den Handler-Quellcode inline mit demSQL-Code aufbewahren, der die Prozedur erstellt, oder das kompilierte Ergebnis des Handlers an einem separaten Ort aufbewahren und von SQL aus referenzieren. Weitere Informationen dazu finden Sie unter Speichern von Handler-Code inline oder in einem Stagingbereich.

Weitere Informationen zum Erstellen von Handler-Quellcode zur Verwendung mit einer Prozedur finden Sie unter Packen des Handler-Codes.

Erstellen und Aufrufen von Prozeduren

Sobald Sie den Handler für eine Prozedur geschrieben haben, können Sie ihn erstellen und mit SQL aufrufen.

Einschränkungen

In dieser Vorschau bestehen für gespeicherte Snowpark-Prozeduren die folgenden Einschränkungen:

  • Parallelität wird nicht unterstützt. So können Sie beispielsweise über Ihren Code keine Abfragen von mehreren Threads übermitteln. Code, der mehrere Abfragen gleichzeitig ausführt, führt zu einem Fehler.

  • Wenn Sie Ihre gespeicherte Prozedur von einer Aufgabe aus ausführen, müssen Sie beim Erstellen der Aufgabe ein Warehouse angeben. (Sie können für die Ausführung der Aufgabe keine von Snowflake verwalteten Computeressourcen verwenden).

  • Das Lesen und Schreiben von Dateien aus in Java geschriebenem Handler-Code von gespeicherten Prozeduren wird noch nicht vollständig unterstützt. Das Lesen und Schreiben von Dateien kann zu instabilem Verhalten führen. Dazu zählt das Empfangen eines InputStream als Argument und die Verwendung von Methoden, die in der Klasse FileOperation verfügbar sind (auf die Sie normalerweise über die Methode Session.file zugreifen), einschließlich put und get.

  • Beachten Sie die folgenden Einschränkungen für die Verwendung von Snowpark-APIs in Ihrer gespeicherten Prozedur.

    • Wenn Sie APIs verwenden, die PUT- und GET-Befehle ausführen (einschließlich Session.sql("PUT ...") und Session.sql("GET ...")), dürfen Sie nur in das Verzeichnis „/tmp“ des speichergestützten Dateisystems schreiben, das für die Abfrage vorgesehen ist, das die Prozedur aufruft.

    • Verwenden Sie keine APIs für asynchrone Aktionen.

    • Verwenden Sie keine APIs, die neue Sitzungen erstellen (z. B. Session.builder().configs(...).create()).

    • Die Verwendung von session.jdbcConnection (und der zurückgegebenen Verbindung) wird nicht unterstützt, da dies zu unsicherem Verhalten führen kann.

  • Das Erstellen benannter temporärer Objekte wird in einer gespeicherten Prozedur mit Eigentümerrechten nicht unterstützt. Eine gespeicherte Prozedur mit Eigentümerrechten ist eine gespeicherte Prozedur, die mit den Berechtigungen des Eigentümers der gespeicherten Prozedur ausgeführt wird. Weitere Informationen dazu finden Sie unter Aufruferrechte oder Eigentümerrechte.

Schreiben des Handler-Codes für die gespeicherte Prozedur

Für die Logik der Prozedur schreiben Sie Handler-Code, der bei Aufruf der Prozedur ausgeführt wird. In diesem Abschnitt wird das Design eines Handlers beschrieben.

Sie können diesen Code in die SQL-Anweisung einfügen, mit der die Prozedur erstellt wird, oder Sie kopieren den Code in einen Stagingbereich und referenzieren ihn dort, wenn Sie die Prozedur erstellen. Weitere Informationen dazu finden Sie unter Speichern von Handler-Code inline oder in einem Stagingbereich.

Planen des Schreibens Ihrer gespeicherten Prozedur

  • Begrenzen Sie den Verbrauch von Arbeitsspeicher.

    Snowflake belegt Methoden mit einer Begrenzung hinsichtlich der benötigten Menge an Arbeitsspeicher. Weitere Informationen dazu, wie Sie zu hohen Speicherverbrauch vermeiden können, finden Sie unter Entwerfen von Handlern unter Berücksichtigung der Snowflake-bedingten Einschränkungen.

  • Schreiben Sie thread-sicheren Code.

    Stellen Sie sicher, dass Ihre Handler-Methode oder Funktion threadsicher ist.

  • Beachten Sie die Sicherheitseinschränkungen.

    Da Ihr Handler-Code wird innerhalb einer eingeschränkten Engine ausgeführt wird, sollten Sie unbedingt die unter Sicherheitsverfahren für UDFs und Prozeduren beschriebenen Regeln befolgen.

  • Entscheiden Sie, ob Sie Eigentümerrechte oder Aufruferrechte nutzen möchten.

    Entscheiden Sie bei der Planung Ihrer gespeicherten Prozedur, ob Sie die gespeicherte Prozedur mit Aufruferrechten oder Eigentümerrechten ausführen möchten.

  • Berücksichtigen Sie das Timeout-Verhalten von gespeicherten Prozeduren.

    Die Ausführung einer gespeicherten Prozedur wird zeitlich begrenzt, es sei denn, der Timer wird durch die Aktivität des Codes zurückgesetzt. Insbesondere wird der Timeout-Timer durch die Interaktionen des Codes mit Daten zurückgesetzt, einschließlich Dateioperationen, Abfragen und Iterationen durch ein Resultset.

Schreiben der Klasse

Die Methode, die Sie definieren, muss Teil einer Klasse sein.

Beim Schreiben der Klasse ist Folgendes zu beachten:

  • Die Klasse und die Methode dürfen nicht geschützt oder privat sein.

  • Wenn die Methode nicht statisch ist und Sie einen Konstruktor definieren möchten, definieren Sie einen Null-Argument-Konstruktor für die Klasse. Snowflake ruft diesen Null-Argument-Konstruktor zur Initialisierungszeit auf, um eine Instanz Ihrer Klasse zu erstellen.

  • Sie können in derselben Klasse verschiedene Methoden für verschiedene gespeicherte Prozeduren definieren.

Schreiben der Methode

Beachten Sie beim Schreiben der Methode für die gespeicherte Prozedur Folgendes:

  • Geben Sie das Snowpark-Session-Objekt als erstes Argument Ihrer Methode an.

    Wenn Sie Ihre gespeicherte Prozedur aufrufen, erstellt Snowflake automatisch ein Session-Objekt und übergibt dieses an Ihre gespeicherte Prozedur. (Sie können das Session-Objekt nicht selbst erstellen.)

  • Für die restlichen Argumente und den Rückgabewert werden die Java-Typen verwendet, die den Snowflake-Datentypen entsprechen.

  • Ihre Methode muss einen Wert zurückgeben. Für gespeicherte Prozeduren in Java ist ein Rückgabewert erforderlich.

  • Die Ausführung einer gespeicherten Prozedur wird zeitlich begrenzt, es sei denn, der Timer wird durch die Aktivität des Codes zurückgesetzt. Insbesondere wird der Timeout-Timer durch die Interaktionen des Codes mit Daten zurückgesetzt, einschließlich Dateioperationen, Abfragen und Iterationen durch ein Resultset.

Fehlerbehandlung

Sie können die üblichen Java-Techniken zur Ausnahmebehandlung verwenden, um Fehler innerhalb des Handler-Codes abzufangen.

Wenn innerhalb der Methode eine Ausnahme auftritt, die nicht von der Methode abgefangen wird, gibt Snowflake einen Fehler aus, der den Stacktrace für die Ausnahme enthält. Wenn die Protokollierung von unbehandelten Ausnahmen aktiviert ist, protokolliert Snowflake Daten zu unbehandelten Ausnahmen in einer Ereignistabelle.

Abhängigkeiten für Code zur Verfügung stellen

Wenn Ihr Handler-Code von Code abhängt, der außerhalb des Handlers selbst definiert ist (z. B. Klassen in einer JAR-Datei) oder von Ressourcendateien, können Sie diese Abhängigkeiten für Ihren Code zur Verfügung stellen, indem Sie ihn in einen Stagingbereich hochladen. Beim Erstellen der Prozedur können Sie diese Abhängigkeiten mithilfe der IMPORTS-Klausel referenzieren.

Weitere Informationen dazu finden Sie unter Abhängigkeiten für Code zur Verfügung stellen.

Zugriff auf Daten in Snowflake über Ihre gespeicherte Prozedur

Um auf Daten in Snowflake zuzugreifen, verwenden Sie die Snowpark-Bibliotheks-APIs.

Bei der Verarbeitung eines Aufrufs Ihrer gespeicherten Java-Prozedur erstellt Snowflake ein Snowpark-Session-Objekt und übergibt das Objekt an die Methode für Ihre gespeicherte Prozedur.

Wie bei gespeicherten Prozeduren in anderen Sprachen wird der Kontext für die Sitzung (z. B. die Berechtigungen, die aktuelle Datenbank, das aktuelle Schema usw.) dadurch bestimmt, ob die gespeicherte Prozedur mit Aufruferrechten oder mit Eigentümerrechten ausgeführt wird. Weitere Details dazu finden Sie unter Accessing and Setting the Session State.

Sie können dieses Session-Objekt verwenden, um APIs in der Snowpark-Bibliothek aufzurufen. Sie können zum Beispiel einen DataFrame für eine Tabelle erstellen oder eine SQL-Anweisung ausführen.

Weitere Informationen dazu finden Sie im Snowpark-Entwicklerhandbuch für Java.

Bemerkung

Weitere Informationen zu Einschränkungen, einschließlich Einschränkungen beim Zugriff auf Daten, finden Sie unter Einschränkungen.

Beispiel für Datenzugriff

Es folgt ein Beispiel für eine Java-Methode, die eine bestimmte Anzahl von Zeilen aus einer Tabelle in eine andere Tabelle kopiert. Der Methode werden die folgenden Argumente übergeben:

  • Ein Snowpark-Session-Objekt

  • Der Name der Tabelle, aus der die Zeilen kopiert werden sollen

  • Der Name der Tabelle, in der die Zeilen gespeichert werden sollen

  • Die Anzahl der zu kopierenden Zeilen

Die Methode in diesem Beispiel gibt eine Zeichenfolge zurück.

import com.snowflake.snowpark_java.*;

public class MyClass
{
  public String myMethod(Session session, String fromTable, String toTable, int count)
  {
    session.table(fromTable).limit(count).write().saveAsTable(toTable);
    return "Success";
  }
}
Copy

Lesen einer Datei mit einer Java-Prozedur

Sie können den Inhalt einer Datei mit Handler-Code lesen. Die Datei muss sich in einem Snowflake-Stagingbereich befinden, auf den Ihr Handler zugreifen kann. Sie könnten zum Beispiel eine Datei lesen, um unstrukturierte Daten im Handler zu verarbeiten.

Um den Inhalt von Stagingdateien zu lesen, kann Ihr Handler Methoden entweder der Klasse SnowflakeFile oder der Klasse InputStream aufrufen: Diese Vorgehensweise kann verwendet werden, wenn Sie während der Verarbeitung dynamisch auf die Datei zugreifen müssen. Weitere Informationen dazu finden Sie unter Lesen einer mit SnowflakeFile dynamisch spezifizierten Datei oder Lesen einer mit InputStream dynamisch spezifizierten Datei (unter diesem Thema).

SnowflakeFile bietet Features, die bei InputStream nicht verfügbar sind, wie in der folgenden Tabelle beschrieben.

Klasse

Eingabe

Anmerkungen

SnowflakeFile

URL-Formate:

  • Bereichs-URL, um das Risiko von Angriffen per Dateieinschleusung zu verringern, wenn der Aufrufer der Funktion nicht deren Eigentümer ist.

  • Datei-URL oder Dateipfad-Zeichenfolge von Dateien, auf die der Eigentümer der Prozedur Zugriff hat.

Die Datei muss sich in einem benannten internen Stagingbereich oder in einem externen Stagingbereich befinden.

Einfacher Zugriff auf zusätzliche Dateiattribute, wie z. B. die Dateigröße.

InputStream

URL-Formate:

  • Bereichs-URL, um das Risiko von Angriffen per Dateieinschleusung zu verringern, wenn der Aufrufer der Funktion nicht deren Eigentümer ist.

Die Datei muss sich in einem benannten internen Stagingbereich oder in einem externen Stagingbereich befinden.

Lesen einer mit SnowflakeFile dynamisch spezifizierten Datei

Im folgenden Codebeispiel nimmt eine Handler-Funktion execute einen String-Wert entgegen und gibt einen String-Wert mit dem Inhalt der Datei zurück. Zur Laufzeit initialisiert Snowflake die Variable fileName des Handlers anhand des eingehenden Dateipfads in der Variablen input der Prozedur. Der Handler-Code verwendet eine SnowflakeFile-Instanz, um die Datei zu lesen.

CREATE OR REPLACE PROCEDURE file_reader_java_proc_snowflakefile(input VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVA
RUNTIME_VERSION = 11
HANDLER = 'FileReader.execute'
PACKAGES=('com.snowflake:snowpark:latest')
AS $$
import java.io.InputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import com.snowflake.snowpark_java.types.SnowflakeFile;
import com.snowflake.snowpark_java.Session;

class FileReader {
  public String execute(Session session, String fileName) throws IOException {
    InputStream input = SnowflakeFile.newInstance(fileName).getInputStream();
    return new String(input.readAllBytes(), StandardCharsets.UTF_8);
  }
}
$$;
Copy

Der Code im folgenden CALL-Beispiel erstellt eine Bereichs-URL, die auf die Datei verweist. Dies ist eine kodierte URL, die temporären Zugriff auf eine Stagingdatei erlaubt, ohne dass Berechtigungen für den Stagingbereich erteilt werden müssen.

CALL file_reader_java_proc_snowflakefile(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));
Copy

Bemerkung

Bei einer gespeicherten Prozedur mit Eigentümerrechten muss der Eigentümer der Prozedur Zugriff auf alle Dateien haben, die keine Bereichs-URLs sind. Bei Prozeduren mit Aufruferrechten muss der Aufrufer Zugriff auf alle Dateien haben, die keine Bereichs-URLs sind. In beiden Fällen können Sie die Stagingdatei lesen, indem Ihr Handler-Code die Methode SnowflakeFile.newInstance mit einem boolean-Wert für einen neuen requireScopedUrl-Parameter aufruft.

Das folgende Beispiel verwendet SnowflakeFile.newInstance und gibt gleichzeitig an, dass keine Bereichs-URL erforderlich ist.

String filename = "@my_stage/filename.txt";
String sfFile = SnowflakeFile.newInstance(filename, false);
Copy

Lesen einer mit InputStream dynamisch spezifizierten Datei

Im folgenden Codebeispiel nimmt eine Handler-Funktion execute einen InputStream-Wert entgegen und gibt einen String-Wert mit dem Inhalt der Datei zurück. Zur Laufzeit initialisiert Snowflake die Variable stream des Handlers anhand des eingehenden Dateipfads im input-Argument der Prozedur. Der Handler-Code verwendet den InputStream, um die Datei zu lesen.

CREATE OR REPLACE PROCEDURE file_reader_java_proc_input(input VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVA
RUNTIME_VERSION = 11
HANDLER = 'FileReader.execute'
PACKAGES=('com.snowflake:snowpark:latest')
AS $$
import java.io.InputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import com.snowflake.snowpark.Session;

class FileReader {
  public String execute(Session session, InputStream stream) throws IOException {
    String contents = new String(stream.readAllBytes(), StandardCharsets.UTF_8);
    return contents;
  }
}
$$;
Copy

Der Code im folgenden CALL-Beispiel erstellt eine Bereichs-URL, die auf die Datei verweist. Dies ist eine kodierte URL, die temporären Zugriff auf eine Stagingdatei erlaubt, ohne dass Berechtigungen für den Stagingbereich erteilt werden müssen.

CALL file_reader_java_proc_input(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));
Copy

Zurückgeben von tabellarischen Daten

Sie können eine Prozedur schreiben, die Daten in tabellarischer Form zurückgibt. Gehen Sie wie folgt vor, um eine Prozedur zu schreiben, die Tabellendaten zurückgibt:

  • Geben Sie in der CREATE PROCEDURE-Anweisung TABLE(...) als Rückgabetyp der Prozedur an.

    Als TABLE-Parameter können Sie die Spaltennamen und Typen der zurückgegebenen Daten angeben, sofern Sie diese kennen. Wenn Sie beim Definieren der Prozedur die zurückgegebenen Spalten nicht kennen – z. B. wenn diese zur Laufzeit angegeben werden – können Sie die TABLE-Parameter weglassen. Wenn Sie dies tun, werden die Spalten des Rückgabewerts der Prozedur aus den Spalten des Datenframes konvertiert, der vom Handler zurückgegeben wird. Spaltendatentypen werden gemäß der unter Zuordnung von Datentypen zwischen SQL und Java angegebenen Zuordnung in SQL konvertiert.

  • Schreiben Sie den Handler so, dass er das tabellarische Ergebnis in einem Snowpark-DataFrame zurückgibt.

    Weitere Informationen zu Datenframes finden Sie unter Verwenden von DataFrames in Snowpark Java.

Bemerkung

Eine Prozedur generiert zur Laufzeit einen Fehler, wenn eine der folgenden Bedingungen zutrifft:

  • TABLE ist als Rückgabetyp deklariert, aber sein Handler gibt keinen DataFrame zurück.

  • Der Handler gibt einen DataFrame zurück, aber die Prozedur deklariert TABLE nicht als Rückgabetyp.

Beispiel

Die Beispiele in diesem Abschnitt veranschaulichen die Rückgabe von Tabellenwerten aus einer Prozedur, die Zeilen herausfiltert, in denen eine Spalte mit einer Zeichenfolge übereinstimmt.

Definieren der Daten

Der Code im folgenden Beispiel erstellt eine Tabelle der Mitarbeiter.

CREATE OR REPLACE TABLE employees(id NUMBER, name VARCHAR, role VARCHAR);
INSERT INTO employees (id, name, role) VALUES (1, 'Alice', 'op'), (2, 'Bob', 'dev'), (3, 'Cindy', 'dev');
Copy

Deklarieren einer Prozedur zum Filtern von Zeilen

Der Code in den folgenden beiden Beispielen erstellt eine gespeicherte Prozedur, die den Tabellennamen und die Rolle als Argumente verwendet und die Zeilen der Tabelle zurückgibt, deren Rollenspaltenwert mit der als Argument angegebenen Rolle übereinstimmt.

Angeben von Namen und Typen der Rückgabespalten

In diesem Beispiel werden Spaltennamen und -typen in der RETURNS TABLE()-Anweisung angegeben.

CREATE OR REPLACE PROCEDURE filter_by_role(table_name VARCHAR, role VARCHAR)
RETURNS TABLE(id NUMBER, name VARCHAR, role VARCHAR)
LANGUAGE JAVA
RUNTIME_VERSION = '11'
PACKAGES = ('com.snowflake:snowpark:latest')
HANDLER = 'Filter.filterByRole'
AS
$$
import com.snowflake.snowpark_java.*;

public class Filter {
  public DataFrame filterByRole(Session session, String tableName, String role) {
    DataFrame table = session.table(tableName);
    DataFrame filteredRows = table.filter(Functions.col("role").equal_to(Functions.lit(role)));
    return filteredRows;
  }
}
$$;
Copy

Bemerkung

Derzeit können Sie in der RETURNS TABLE(...)-Klausel den Datentyp GEOGRAPHY nicht als Spaltentyp angeben. Dies gilt unabhängig davon, ob Sie eine gespeicherte oder eine anonyme Prozedur erstellen.

CREATE OR REPLACE PROCEDURE test_return_geography_table_1()
  RETURNS TABLE(g GEOGRAPHY)
  ...
Copy
WITH test_return_geography_table_1() AS PROCEDURE
  RETURNS TABLE(g GEOGRAPHY)
  ...
CALL test_return_geography_table_1();
Copy

Wenn Sie versuchen, GEOGRAPHY als Spaltentyp anzugeben, führt der Aufruf der gespeicherten Prozedur zu einem Fehler:

Stored procedure execution error: data type of returned table does not match expected returned table type
Copy

Um dieses Problem zu umgehen, können Sie die Spaltenargumente und -typen in RETURNS TABLE() weglassen.

CREATE OR REPLACE PROCEDURE test_return_geography_table_1()
  RETURNS TABLE()
  ...
Copy
WITH test_return_geography_table_1() AS PROCEDURE
  RETURNS TABLE()
  ...
CALL test_return_geography_table_1();
Copy
Weglassen von Namen und Typen der Rückgabespalten

Der Code im folgenden Beispiel deklariert eine Prozedur, mit der Spaltennamen und -typen des Rückgabewerts aus den im Rückgabewert des Handlers enthaltenen Spalten extrapoliert werden können. Die Spaltennamen und -typen aus der RETURNS TABLE()-Anweisung werden weggelassen.

CREATE OR REPLACE PROCEDURE filter_by_role(table_name VARCHAR, role VARCHAR)
RETURNS TABLE()
LANGUAGE JAVA
RUNTIME_VERSION = '11'
PACKAGES = ('com.snowflake:snowpark:latest')
HANDLER = 'FilterClass.filterByRole'
AS
$$
import com.snowflake.snowpark_java.*;

public class FilterClass {
  public DataFrame filterByRole(Session session, String tableName, String role) {
    DataFrame table = session.table(tableName);
    DataFrame filteredRows = table.filter(Functions.col("role").equal_to(Functions.lit(role)));
    return filteredRows;
  }
}
$$;
Copy

Aufrufen der Prozedur

Im folgenden Beispiel wird die gespeicherte Prozedur aufgerufen:

CALL filter_by_role('employees', 'dev');
Copy

Der Prozeduraufruf erzeugt die folgende Ausgabe:

+----+-------+------+
| ID | NAME  | ROLE |
+----+-------+------+
| 2  | Bob   | dev  |
| 3  | Cindy | dev  |
+----+-------+------+

Vorbereiten einer in einem Stagingbereich gespeicherten Prozedur

Wenn Sie vorhaben, eine gespeicherte Prozedur zu erstellen, deren Handler kompiliert und in einen Stagingbereich kopiert wird (anstatt als Quelle inline aufbewahrt zu werden), müssen Sie Ihre Klassen in eine JAR-Datei kompilieren und verpacken, und Sie müssen die JAR-Datei in den Stagingbereich hochladen.

  1. Handler-Code kompilieren und packen

    Um das Einrichten Ihrer gespeicherten Prozedur zu vereinfachen, erstellen Sie eine JAR-Datei, die alle für Ihre gespeicherte Prozedur benötigten Abhängigkeiten enthält. Später müssen Sie die JAR-Datei in einen Stagingbereich hochladen und in Ihrer CREATE PROCEDURE-Anweisung auf die JAR-Datei verweisen. Dieser Vorgang ist einfacher, wenn Sie weniger JAR-Dateien hochladen und auf sie verweisen müssen.

    • Verwenden von Maven zum Erstellen einer JAR-Datei mit Abhängigkeiten.

      Wenn Sie Maven zum Erstellen und Packen Ihres Codes verwenden, können Sie das Maven Assembly Plugin verwenden, um eine JAR-Datei zu erstellen, die alle Abhängigkeiten enthält. Weitere Informationen dazu finden Sie unter Packen von Java- oder Scala-Handler-Code mit Maven.

    • Verwenden anderer Tools zum Erstellen einer JAR-Datei mit Abhängigkeiten.

      Wenn Sie Maven nicht verwenden, finden Sie in der Dokumentation Ihres Erstellungstools eine Anleitung zum Erstellen einer JAR-Datei mit allen Abhängigkeiten.

      Wenn Sie beispielsweise ein IntelliJ IDEA-Projekt verwenden, finden Sie die erforderlichen Informationen in der Anleitung zum Einrichten einer Artefakt-Konfiguration.

  2. Dateien in einen Stagingbereich hochladen

    Um die Logik Ihrer Prozedur (und ggf. andere Abhängigkeiten) für die Prozedur zur Verfügung zu stellen, müssen Sie die erforderlichen Dateien in einen Stagingbereich hochladen. Weitere Informationen dazu finden Sie unter Abhängigkeiten für Code zur Verfügung stellen.