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> ... ] ) );
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);
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;
Hinweis: Wenn Sie Snowflake CLI, SnowSQL, die Classic Console, oder die Methode execute_stream oder execute_string in Python Connector Code verwenden, benutzen Sie stattdessen dieses Beispiel (siehe Verwenden von Snowflake Scripting in Snowflake CLI, SnowSQL, Classic Console und im Python-Connector):
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;
$$
;
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'));
+----------+------------+--------------+
| 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)
Eine gespeicherte Prozedur mit der folgenden RETURNS-Klausel wird nicht unterstützt, da sie keine tabellarischen Daten zurückgibt:
RETURNS STRING
Eine gespeicherte Prozedur mit der folgenden RETURNS-Klausel wird nicht unterstützt, da sie kein festes Ausgabeschema bietet:
RETURNS TABLE()
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.
Sie können Bindungsvariablen in einer SELECT-Anweisung, die eine gespeicherte Prozedur aufruft, nicht verwenden. Beispielsweise sind die folgenden SELECT-Anweisungen nicht zulässig:
SELECT * FROM TABLE(my_stored_procedure(?)); SELECT * FROM TABLE(my_stored_procedure('a')) WHERE my_var = :var2;