Auswählen aus einer gespeicherten Prozedur

Einige gespeicherte Prozeduren geben tabellarische Daten zurück. Um diese Tabellendaten auszuwählen und zu bearbeiten, können Sie diese gespeicherten Prozeduren in der FROM-Klausel einer SELECT-Anweisung aufrufen.

Führen Sie eine SELECT-Anweisung mit dem TABLE-Schlüsselwort aus

Wenn Sie die gespeicherte Prozedur aufrufen, lassen Sie den Befehl CALL weg. Verwenden Sie stattdessen das TABLE Schlüsselwort, und benennen Sie die Prozedur in Klammern:

SELECT ... FROM TABLE( <stored_procedure_name>( <arg> [ , <arg> ... ] ) );
Copy

Beispiel für die Auswahl aus einer gespeicherten Prozedur

Dieses Beispiel verwendet die Daten in der folgenden Tabelle:

CREATE OR REPLACE TABLE orders (
  order_id INT,
  u_id VARCHAR,
  order_date DATE,
  order_amount NUMBER(12,2));

INSERT INTO orders VALUES (1, 'user_id_001', current_date, 500.00);
INSERT INTO orders VALUES (2, 'user_id_003', current_date, 225.00);
INSERT INTO orders VALUES (3, 'user_id_001', current_date, 725.00);
INSERT INTO orders VALUES (4, 'user_id_002', current_date, 150.00);
INSERT INTO orders VALUES (5, 'user_id_002', current_date, 900.00);
Copy

Die folgende gespeicherte Prozedur gibt Auftragsinformationen auf der Grundlage einer Benutzer-ID zurück:

CREATE OR REPLACE PROCEDURE find_orders_by_user_id(user_id VARCHAR)
RETURNS TABLE (
  order_id INT, order_date DATE, order_amount NUMBER(12,2)
)
LANGUAGE SQL AS
DECLARE
  res RESULTSET;
BEGIN
  res := (SELECT order_id, order_date, order_amount FROM orders WHERE u_id = :user_id);
  RETURN TABLE(res);
END;
Copy

Hinweis: Wenn Sie SnowSQL, die Classic Console oder die execute_stream- oder execute_string-Methode im Python-Konnektor-Code verwenden, benutzen Sie stattdessen das folgende Beispiel (siehe Verwenden von Snowflake Scripting in SnowSQL, in der Classic Console und im Python-Konnektor):

CREATE OR REPLACE PROCEDURE find_orders_by_user_id(user_id VARCHAR)
RETURNS TABLE (
  order_id INT, order_date DATE, order_amount NUMBER(12,2)
)
LANGUAGE SQL AS
$$
DECLARE
  res RESULTSET;
BEGIN
  res := (SELECT order_id, order_date, order_amount FROM orders WHERE u_id = :user_id);
  RETURN TABLE(res);
END;
$$
;
Copy

Mit der folgenden SELECT-Anweisung können Sie die Ergebnisse der gespeicherten Prozedur abrufen:

SELECT * FROM TABLE(find_orders_by_user_id('user_id_001'));
Copy
+----------+------------+--------------+
| ORDER_ID | ORDER_DATE | ORDER_AMOUNT |
|----------+------------+--------------|
|        1 | 2024-08-30 |       500.00 |
|        3 | 2024-08-30 |       725.00 |
+----------+------------+--------------+

Beschränkungen für die Auswahl aus einer gespeicherten Prozedur

Die folgenden Beschränkungen gelten für die Auswahl aus einer gespeicherten Prozedur:

  • Nur gespeicherte Prozeduren, die die Anweisungen SELECT, SHOW, DESCRIBE oder CALL ausführen, können in der FROM-Klausel einer SELECT-Anweisung platziert werden. Gespeicherte Prozeduren, die Änderungen mit den Operationen DDL oder DML vornehmen, sind nicht erlaubt. Für gespeicherte Prozeduren, die CALL-Anweisungen ausgeben, gelten diese Beschränkungen für die aufgerufenen gespeicherten Prozeduren.

  • Nur gespeicherte Prozeduren, die tabellarische Daten mit einem statischen Ausgabeschema zurückgeben, können in der FROM-Klausel einer SELECT-Anweisung platziert werden. Die Ausgabespalten müssen benannt und typisiert werden. Zum Beispiel wird eine gespeicherte Prozedur mit der folgenden RETURNS-Klausel unterstützt:

    RETURNS TABLE (col1 INT, col2 STRING)
    
    Copy

    Eine gespeicherte Prozedur mit der folgenden RETURNS-Klausel wird nicht unterstützt, da sie keine tabellarischen Daten zurückgibt:

    RETURNS STRING
    
    Copy

    Eine gespeicherte Prozedur mit der folgenden RETURNS-Klausel wird nicht unterstützt, da sie kein festes Ausgabeschema bietet:

    RETURNS TABLE()
    
    Copy
  • Die gespeicherte Prozedur muss in der FROM-Klausel eines SELECT-Blocks in einer der folgenden Anweisungen aufgerufen werden:

  • Die gespeicherte Prozedur kann keine korrelierten Eingabeargumente aus ihrem äußeren Bereich akzeptieren, wie z. B. eine Referenz auf eine CTE, die außerhalb der SELECT-Anweisung definiert ist.

  • Wenn ein Argument eine Unterabfrage enthält, dann kann diese Unterabfrage keine CTE verwenden, die durch die WITH-Klausel definiert ist.

  • Eine SELECT-Anweisung, die einen Aufruf einer gespeicherten Prozedur enthält, kann nicht im Body einer Ansicht, einer benutzerdefinierten Funktion (UDF), einer benutzerdefinierten Tabellenfunktion (UDTF) oder in Objekten wie Zeilenzugriffsrichtlinien und Maskierungsrichtlinien verwendet werden.