CALL (mit anonymen Prozeduren)

Ermöglicht das Erstellen und Aufrufen einer anonymen Prozedur, die wie eine gespeicherte Prozedur ist, aber nicht zur späteren Verwendung gespeichert wird.

Mit diesem Befehl erstellen Sie eine anonyme Prozedur, die durch Parameter in der WITH-Klausel definiert ist, und rufen diese Prozedur auf.

Für diesen Befehl benötigen Sie keine Rolle mit CREATE PROCEDURE-Schemaberechtigungen.

Die Prozedur wird mit Aufruferrechten ausgeführt, was bedeutet, dass die Prozedur mit den Berechtigungen des Aufrufers ausgeführt wird, dass sie den aktuellen Sitzungskontext verwendet und Zugriff auf die Sitzungsvariablen und Parameter des Aufrufers hat.

Siehe auch:

CREATE PROCEDURE, CALL.

Syntax

Java und Scala

WITH <name> AS PROCEDURE ([ <arg_name> <arg_data_type> ]) [ , ... ] )
  RETURNS { <result_data_type> [ [ NOT ] NULL ] | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
  LANGUAGE { SCALA | JAVA }
  RUNTIME_VERSION = '<scala_or_java_runtime_version>'
  PACKAGES = ( 'com.snowflake:snowpark:<version>' [, '<package_name_and_version>' ...] )
  [ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
  HANDLER = '<fully_qualified_method_name>'
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ AS '<procedure_definition>' ]
  [ , <cte_nameN> [ ( <cte_column_list> ) ] AS ( SELECT ...  ) ]
CALL <name> ( [ [ <arg_name> => ] <arg> , ... ] )
  [ INTO :<snowflake_scripting_variable> ]
Copy

Bei Java- und Scala-Prozeduren mit Staging-Handlern verwenden Sie die folgende Syntax:

WITH <name> AS PROCEDURE ([ <arg_name> <arg_data_type> ]) [ , ... ] )
  RETURNS { <result_data_type> [ [ NOT ] NULL ] | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
  LANGUAGE { SCALA | JAVA }
  RUNTIME_VERSION = '<scala_or_java_runtime_version>'
  PACKAGES = ( 'com.snowflake:snowpark:<version>' [, '<package_name_and_version>' ...] )
  [ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
  HANDLER = '<fully_qualified_method_name>'
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ , <cte_nameN> [ ( <cte_column_list> ) ] AS ( SELECT ...  ) ]
CALL <name> ( [ [ <arg_name> => ] <arg> , ... ] )
  [ INTO :<snowflake_scripting_variable> ]
Copy

JavaScript

WITH <name> AS PROCEDURE ([ <arg_name> <arg_data_type> ]) [ , ... ] )
  RETURNS <result_data_type> [ [ NOT ] NULL ]
  LANGUAGE JAVASCRIPT
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  AS '<procedure_definition>'
  [ , <cte_nameN> [ ( <cte_column_list> ) ] AS ( SELECT ...  ) ]
CALL <name> ( [ [ <arg_name> => ] <arg> , ... ] )
  [ INTO :<snowflake_scripting_variable> ]
Copy

Python

Für Inline-Prozeduren verwenden Sie die folgende Syntax:

WITH <name> AS PROCEDURE ( [ <arg_name> <arg_data_type> ] [ , ... ] )
  RETURNS { <result_data_type> [ [ NOT ] NULL ] | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
  LANGUAGE PYTHON
  RUNTIME_VERSION = '<python_version>'
  PACKAGES = ( 'snowflake-snowpark-python[==<version>]'[, '<package_name>[==<version>]' ... ])
  [ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
  HANDLER = '<function_name>'
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ , <cte_nameN> [ ( <cte_column_list> ) ] AS ( SELECT ...  ) ]
  AS '<procedure_definition>'
CALL <name> ( [ [ <arg_name> => ] <arg> , ... ] )
  [ INTO :<snowflake_scripting_variable> ]
Copy

Für eine Prozedur, bei der sich der Code in einer Datei in einem Stagingbereich befindet, verwenden Sie die folgende Syntax:

WITH <name> AS PROCEDURE ( [ <arg_name> <arg_data_type> ] [ , ... ] )
  RETURNS { <result_data_type> [ [ NOT ] NULL ] | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
  LANGUAGE PYTHON
  RUNTIME_VERSION = '<python_version>'
  PACKAGES = ( 'snowflake-snowpark-python[==<version>]'[, '<package_name>[==<version>]' ... ])
  [ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
  HANDLER = '<module_file_name>.<function_name>'
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ , <cte_nameN> [ ( <cte_column_list> ) ] AS ( SELECT ...  ) ]
CALL <name> ( [ [ <arg_name> => ] <arg> , ... ] )
  [ INTO :<snowflake_scripting_variable> ]
Copy

Snowflake Scripting

WITH <name> AS PROCEDURE ([ <arg_name> <arg_data_type> ]) [ , ... ] )
  RETURNS { <result_data_type> | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
  LANGUAGE SQL
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  AS '<procedure_definition>'
  [ , <cte_nameN> [ ( <cte_column_list> ) ] AS ( SELECT ...  ) ]
CALL <name> ( [ [ <arg_name> => ] <arg> , ... ] )
  [ INTO :<snowflake_scripting_variable> ]
Copy

Erforderliche Parameter

Alle Sprachen

WITH name AS PROCEDURE ( [ arg_name arg_data_type ] [ , ... ] )

Gibt den Bezeichner (name) und alle Eingabeargumente für die Prozedur an.

RETURNS result_data_type [ [ NOT ] NULL ]

Gibt den von der Prozedur zurückgegebenen Ergebnistyp an.

Verwenden Sie NOT NULL, um anzugeben, dass die Prozedur nur Nicht-Null-Werte zurückgeben darf. Der Standardwert ist NULL, was bedeutet, dass die Prozedur NULL zurückgeben kann.

  • Verwenden Sie für result_data_type (Ergebnisdatentyp) den Snowflake-Datentyp, der dem Typ der von Ihnen verwendeten Sprache entspricht.

    Bemerkung

    Prozeduren, die Sie in Java oder Scala schreiben, müssen einen Rückgabewert haben. Wenn in Python eine Prozedur keinen Wert zurückgibt, wird dies als Rückgabe von None verarbeitet.

    Beachten Sie, dass die WITH-Anweisung dieses Befehls unabhängig von der Handler-Sprache eine RETURNS-Klausel enthalten muss, die einen Rückgabetyp definiert, auch wenn die Prozedur nicht explizit etwas zurückgibt.

  • Wenn Sie die Snowflake-Datentypen der Spalten in der zurückgegebenen Tabelle kennen, geben Sie in RETURNS TABLE ( [ col_name col_data_type [ , ... ] ] ) die Spaltennamen („col_name“) und Spaltendatentypen („col_data_type“) an.

    WITH get_top_sales() AS PROCEDURE
      RETURNS TABLE (sales_date DATE, quantity NUMBER)
      ...
    CALL get_top_sales();
    
    Copy

    Andernfalls (z. B. wenn Sie die Spaltentypen während der Laufzeit bestimmen) können Sie die Spaltennamen und -typen weglassen:

    WITH get_top_sales() AS PROCEDURE
      ...
      RETURNS TABLE ()
    CALL get_top_sales();
    
    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

    RETURNS TABLE(...) wird nur unterstützt, wenn der Handler in den folgenden Sprachen geschrieben ist:

In der Praxis kann der zurückgegebene Wert nicht außerhalb eines Snowflake Scripting-Blocks verwendet werden, da der Aufruf nicht Teil eines Ausdrucks sein kann.

LANGUAGE language

Gibt die Sprache des Handler-Codes der Prozedur an.

Derzeit werden folgende Werte für language (Sprache) unterstützt:

AS procedure_definition

Definiert den Code, der von der Prozedur ausgeführt wird. Die Definition kann aus jedem gültigen Code bestehen.

Beachten Sie Folgendes:

  • Bei Prozeduren, für die der Code nicht inline ist, lassen Sie die AS-Klausel weg. Dazu gehören Prozeduren, deren Handler sich in einem Stagingbereich befinden.

    Verwenden Sie stattdessen die IMPORTS-Klausel, um den Speicherort der Datei anzugeben, die den Code für die Prozedur enthält. Weitere Details dazu finden Sie unter:

  • In folgenden Fällen müssen Sie procedure definition auch in Snowflake Scripting mit Trennzeichen für Zeichenfolgenliterale (' oder $$) umschließen:

  • Wenn Sie Prozeduren in JavaScript schreiben und eine Zeichenfolge Zeilenumbrüche enthält, können Sie die Zeichenfolge mit Backquotes (auch „Backticks“ genannt) umschließen.

    Im folgenden Beispiel einer JavaScript-Prozedur werden $$ und Backquotes verwendet, da der Text der Prozedur einfache und doppelte Anführungszeichen enthält:

    WITH proc3 AS PROCEDURE ()
      RETURNS VARCHAR
      LANGUAGE javascript
      AS
      $$
      var rs = snowflake.execute( { sqlText:
          `INSERT INTO table1 ("column 1")
              SELECT 'value 1' AS "column 1" ;`
          } );
      return 'Done.';
      $$
    CALL proc3();
    
    Copy
  • Snowflake validiert den Handler-Code nicht. Ungültiger Handler-Code führt jedoch bei Ausführung des Befehls zu Fehlern.

Weitere Informationen zu gespeicherten Prozeduren finden Sie unter Verwenden von gespeicherten Prozeduren.

CALL name ( [ [ arg_name => ] arg , ... ] )

Gibt den Bezeichner (name) für die aufzurufende Prozedur sowie alle Eingabeargumente an.

Sie können die Eingabeargumente entweder über den Namen (arg_name => arg) oder über die Position (arg) angeben.

Beachten Sie Folgendes:

  • Sie müssen alle Argumente entweder über den Namen oder über die Position angeben. Sie können nicht einige der Argumente über den Namen und andere Argumente über die Position angeben.

    Wenn Sie ein Argument über den Namen angeben, können Sie den Argumentnamen nicht in doppelten Anführungszeichen einschließen.

  • Wenn zwei Funktionen oder zwei Prozeduren den gleichen Namen, aber unterschiedliche Argumenttypen haben, können Sie die Argumentnamen verwenden, um anzugeben, welche Funktion bzw. Prozedur ausgeführt werden soll, allerdings müssen die Argumentnamen unterschiedlich sein. Weitere Informationen dazu finden Sie unter Überladen von Prozeduren und Funktionen.

Java, Python oder Scala

RUNTIME_VERSION = 'language_runtime_version'

Die zu verwendende Laufzeitversion der Programmiersprache. Folgende Versionen werden derzeit unterstützt:

  • Java: 11

  • Python:

    • 3.8

    • 3.9

    • 3.10

  • Scala: 2.12

PACKAGES = ( 'snowpark_package_name' [, 'package_name' ...] )

Eine durch Komma getrennte Liste mit den Namen der in Snowflake bereitgestellten Pakete, die in die Ausführungsumgebung des Handler-Codes aufgenommen werden sollen. Das Snowpark-Paket ist für Prozeduren erforderlich und muss daher immer in der PACKAGES-Klausel referenziert werden. Weitere Informationen zu Snowpark finden Sie unter Snowpark-API.

Standardmäßig enthält die Umgebung, in der Snowflake Prozeduren ausführt, einen ausgewählten Satz von Paketen für unterstützte Sprachen. Wenn Sie in der PACKAGES-Klausel auf diese Pakete verweisen, ist es nicht erforderlich, in der IMPORTS-Klausel auf eine Datei zu verweisen, die das Paket enthält, da das Paket bereits in Snowflake verfügbar ist.

Eine Liste der unterstützten Pakete und Versionen erhalten Sie, indem Sie die Ansicht INFORMATION_SCHEMA.PACKAGES unter Angabe der Sprache abfragen. Beispiel:

SELECT * FROM information_schema.packages WHERE language = '<language>';
Copy

wobei language (Sprache) den Wert java, python oder scala hat.

Die Syntax für den Verweis auf ein Paket in der PACKAGES-Klausel variiert je nach der Sprache des Pakets, wie unten beschrieben.

  • Java

    Geben Sie den Paketnamen und die Versionsnummer in der folgenden Form an:

    domain:package_name:version
    
    Copy

    Für die neueste Version geben Sie latest für version an.

    Um beispielsweise ein Paket aus der neuesten Snowpark-Bibliothek in Snowflake einzubinden, verwenden Sie Folgendes:

    PACKAGES = ('com.snowflake:snowpark:latest')
    
    Copy

    Wenn Sie ein Paket aus der Snowpark-Bibliothek angeben, müssen Sie Version 1.3.0 oder höher angeben.

  • Python

    Snowflake enthält eine große Anzahl von Paketen, die über Anaconda verfügbar sind. Weitere Informationen dazu finden Sie unter Verwenden von Drittanbieter-Paketen.

    Geben Sie den Paketnamen und die Versionsnummer in der folgenden Form an:

    package_name[==version]
    
    Copy

    Um die neueste Version anzugeben, lassen Sie die Versionsnummer weg.

    Um beispielsweise Version 2.3.5 des spacy-Pakets (zusammen mit der neuesten Version des erforderlichen Snowpark-Pakets) einzubinden, verwenden Sie Folgendes:

    PACKAGES = ('snowflake-snowpark-python', 'spacy==2.3.5')
    
    Copy

    Wenn Sie ein Paket aus der Snowpark-Bibliothek angeben, müssen Sie Version 0.4.0 oder höher angeben. Lassen Sie die Versionsnummer weg, um die neueste in Snowflake verfügbare Version zu verwenden.

  • Scala

    Geben Sie den Paketnamen und die Versionsnummer in der folgenden Form an:

    domain:package_name:version
    
    Copy

    Für die neueste Version geben Sie latest für version an.

    Um beispielsweise ein Paket aus der neuesten Snowpark-Bibliothek in Snowflake einzubinden, verwenden Sie Folgendes:

    PACKAGES = ('com.snowflake:snowpark:latest')
    
    Copy

    Snowflake unterstützt die Verwendung von Snowpark, Version 0.9.0 oder höher in einer Scala-Prozedur. Beachten Sie jedoch, dass diese Versionen Einschränkungen haben. So unterstützen Versionen vor 1.1.0 beispielsweise nicht die Verwendung von Transaktionen in einer Prozedur.

HANDLER = 'fully_qualified_method_name'
  • Python

    Verwenden Sie den Namen der Funktion oder Methode der Prozedur. Dies kann unterschiedlich sein, je nachdem, ob der Code inline ist oder er in einem Stagingbereich referenziert wird.

    • Wenn der Code inline ist, können Sie nur den Funktionsnamen angeben, wie im folgenden Beispiel:

      WITH myproc AS PROCEDURE()
        ...
        HANDLER = 'run'
        AS
        $$
        def run(session):
          ...
        $$
      CALL myproc();
      
      Copy
    • Wenn der Code aus einem Stagingbereich importiert wird, geben Sie den vollqualifizierten Namen der Handlerfunktion als <Name_des_Moduls>.<Name_der_Funktion> an.

      WITH myproc AS PROCEDURE()
        ...
        IMPORTS = ('@mystage/my_py_file.py')
        HANDLER = 'my_py_file.run'
      CALL myproc();
      
      Copy
  • Java und Scala

    Verwenden Sie den vollqualifizierten Namen der Methode oder Funktion der Prozedur. Dies geschieht typischerweise in der folgenden Form:

    com.my_company.my_package.MyClass.myMethod
    
    Copy

    Wobei:

    com.my_company.my_package
    
    Copy

    entspricht dem Paket, das das Objekt oder die Klasse enthält:

    package com.my_company.my_package;
    
    Copy

Optionale Parameter

Alle Sprachen

CALLED ON NULL INPUT oder . RETURNS NULL ON NULL INPUT | STRICT

Gibt das Verhalten der Prozedur an, wenn sie mit Null-Eingaben aufgerufen wird. Im Gegensatz zu systemdefinierten Funktionen, die immer Null zurückgeben, wenn eine Eingabe Null ist, können Prozeduren Null-Eingaben verarbeiten und Nicht-Null-Werte zurückgeben, auch wenn eine Eingabe Null ist:

  • CALLED ON NULL INPUT ruft die Prozeduren immer mit Null-Eingaben auf. Es liegt an der Prozedur, mit solchen Werten angemessen umzugehen.

  • RETURNS NULL ON NULL INPUT (oder dessen Synonym STRICT) ruft die Prozedur nicht auf, wenn eine Eingabe Null ist, sodass die Anweisungen in der Prozedur nicht ausgeführt werden. Stattdessen wird immer ein Null-Wert zurückgegeben. Beachten Sie, dass die Prozedur bei Nicht-Null-Eingaben immer noch Null zurückgeben kann.

Standard: CALLED ON NULL INPUT

INTO :snowflake_scripting_variable

Setzt die angegebene Snowflake Scripting-Variable auf den Rückgabewert der gespeicherten Prozedur.

Java, Python oder Scala

IMPORTS = ( 'stage_path_and_file_name_to_read' [, 'stage_path_and_file_name_to_read' ...] )

Der Speicherort (Stagingbereich), der Pfad und der Name der zu importierenden Datei(en). Sie müssen die IMPORTS-Klausel festlegen, um alle Dateien einzuschließen, von denen Ihre Prozedur abhängt:

  • Wenn Sie eine Inline-Prozedur schreiben, können Sie diese Klausel weglassen, es sei denn, Ihr Code hängt von Klassen ab, die außerhalb der Prozedur oder der Ressourcendateien definiert sind.

  • Java oder Scala: Wenn Sie eine Prozedur schreiben, deren Handler kompilierter Code ist, müssen Sie auch einen Pfad zu der JAR-Datei angeben, die den Handler der Prozedur enthält.

  • Python: Wenn sich der Code Ihrer Prozedur in einem Stagingbereich befindet, müssen Sie auch einen Pfad zu der Moduldatei angeben, in der sich der Code befindet.

Jede Datei in der IMPORTS-Klausel muss einen eindeutigen Namen haben, auch wenn sich die Dateien in verschiedenen Unterverzeichnissen oder verschiedenen Stagingbereichen befinden.

Nutzungshinweise

Allgemeine Nutzung

  • Prozeduren sind nicht atomar. Wenn eine Anweisung in einer Prozedur fehlschlägt, werden die anderen Anweisungen in der Prozedur nicht unbedingt zurückgesetzt. Weitere Informationen zu Prozeduren und Transaktionen finden Sie unter Transaktionsmanagement.

  • Eine Prozedur kann nur einen einzigen Wert zurückgeben, z. B. eine Zeichenfolge (beispielsweise einen Erfolg/Fehler-Indikator) oder eine Zahl (z. B. einen Fehlercode). Wenn Sie umfangreichere Daten zurückgeben müssen, können Sie einen VARCHAR-Wert verwenden, der durch ein Trennzeichen (z. B. ein Komma) getrennte Werte enthält, oder Sie verwenden einen Datentyp für semistrukturierte Daten wie VARIANT.

  • Hinweis zu Metadaten:

    Achtung

    Kunden müssen sicherstellen, dass bei der Nutzung des Snowflake-Dienstes keine personenbezogenen Daten (außer für ein Objekt „Benutzer“), sensible Daten, exportkontrollierte Daten oder andere regulierte Daten als Metadaten eingegeben werden. Weitere Informationen dazu finden Sie unter Metadatenfelder in Snowflake.

Syntax

  • Ähnlich wie bei der Verwendung einer WITH-Klausel mit einer SELECT-Anweisung können bei der Verwendung einer WITH-Klausel mit CALL zusätzlich zur Prozedurdefinition mehrere durch Kommas getrennte CTEs angegeben werden. Es ist jedoch nicht möglich, tabellarische Werte, die durch eine WITH-Klausel erzeugt wurden, an die CALL-Klausel zu übergeben.

    Es ist jedoch möglich, eine einfache Variable anzugeben, deren Wert in der WITH-Klausel zugewiesen wird.

  • Die CALL-Klausel muss in der Syntax an letzter Stelle stehen.

Berechtigungen

  • Das Erstellen und Aufrufen einer Prozedur mit diesem Befehl erfordert keine Rolle mit CREATE PROCEDURE-Schemaberechtigungen.

  • Der Handler-Code der Prozedur kann nur Aktionen ausführen, die für die Rolle der Person, die diesen Befehl ausgeführt hat, zulässig sind.

Hinweise zu Programmiersprachen

Beispiele

Im folgenden Beispiel wird eine Prozedur erstellt und aufgerufen, bei der die Argumente über die Position angegeben werden:

WITH copy_to_table AS PROCEDURE (fromTable STRING, toTable STRING, count INT)
  RETURNS STRING
  LANGUAGE SCALA
  RUNTIME_VERSION = '2.12'
  PACKAGES = ('com.snowflake:snowpark:latest')
  HANDLER = 'DataCopy.copyBetweenTables'
  AS
  $$
    object DataCopy
    {
      def copyBetweenTables(session: com.snowflake.snowpark.Session, fromTable: String, toTable: String, count: Int): String =
      {
        session.table(fromTable).limit(count).write.saveAsTable(toTable)
        return "Success"
      }
    }
  $$
  CALL copy_to_table('table_a', 'table_b', 5);
Copy

Im folgenden Beispiel wird eine Prozedur erstellt und aufgerufen, bei der die Argumente über den Namen angegeben werden:

WITH copy_to_table AS PROCEDURE (fromTable STRING, toTable STRING, count INT)
  RETURNS STRING
  LANGUAGE SCALA
  RUNTIME_VERSION = '2.12'
  PACKAGES = ('com.snowflake:snowpark:latest')
  HANDLER = 'DataCopy.copyBetweenTables'
  AS
  $$
    object DataCopy
    {
      def copyBetweenTables(session: com.snowflake.snowpark.Session, fromTable: String, toTable: String, count: Int): String =
      {
        session.table(fromTable).limit(count).write.saveAsTable(toTable)
        return "Success"
      }
      }
    }
  $$
  CALL copy_to_table(
    toTable => 'table_b',
    count => 5,
    fromTable => 'table_a');
Copy

Weitere Beispiele finden Sie unter den folgenden Themen:

Weitere Beispiele für Prozeduren finden Sie unter Verwenden von gespeicherten Prozeduren.