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 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;
$$
;
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.