Seleção de um procedimento armazenado

Alguns procedimentos armazenados retornam dados tabulares. Para selecionar e manipular esses dados tabulares, é possível chamar esses procedimentos armazenados na cláusula FROM de uma instrução SELECT.

Execute uma instrução SELECT com a palavra-chave TABLE

Ao chamar o procedimento armazenado, omita o comando CALL. Em vez disso, use a palavra-chave TABLE e nomeie o procedimento entre parênteses:

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

Exemplo que seleciona a partir de um procedimento armazenado

Este exemplo usa os dados da tabela a seguir:

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

O seguinte procedimento armazenado retorna informações de pedidos com base em um ID de usuário:

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

Observação: se você estiver usando o método SnowSQL, o Classic Console, execute_stream ou execute_string no código Python Connector, use este exemplo (consulte Uso do Script Snowflake em SnowSQL, Classic Console e conector Python):

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

A instrução SELECT a seguir recupera os resultados do procedimento armazenado:

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 |
+----------+------------+--------------+

Limitações para seleção de um procedimento armazenado

As seguintes limitações se aplicam à seleção de um procedimento armazenado:

  • Somente procedimentos armazenados que executam instruções SELECT, SHOW, DESCRIBE ou CALL podem ser colocados na cláusula FROM de uma instrução SELECT. Procedimentos armazenados que fazem modificações usando operações DDL ou DML não são permitidos. Para procedimentos armazenados que emitem instruções CALL, essas limitações se aplicam aos procedimentos armazenados que são chamados.

  • Somente procedimentos armazenados que retornam dados tabulares com um esquema de saída estático podem ser colocados na cláusula FROM de uma instrução SELECT. As colunas de saída devem ser nomeadas e digitadas. Por exemplo, um procedimento armazenado com a seguinte cláusula RETURNS é compatível:

    RETURNS TABLE (col1 INT, col2 STRING)
    
    Copy

    Um procedimento armazenado com a seguinte cláusula RETURNS não é compatível porque não retorna dados tabulares:

    RETURNS STRING
    
    Copy

    Um procedimento armazenado com a seguinte cláusula RETURNS não é compatível porque não fornece um esquema de saída fixa:

    RETURNS TABLE()
    
    Copy
  • O procedimento armazenado deve ser chamado na cláusula FROM de um bloco SELECT em uma das seguintes instruções:

  • O procedimento armazenado não pode aceitar argumentos de entrada correlacionados de seu escopo externo, como uma referência a qualquer CTE definida fora da instrução SELECT.

  • Se um argumento contiver uma subconsulta, essa subconsulta não poderá usar uma CTE definida pela cláusula WITH.

  • Uma instrução SELECT com uma chamada de procedimento armazenado não pode ser usada no corpo de uma exibição, uma função definida pelo usuário (UDF), uma função de tabela definida pelo usuário (UDTF) ou em objetos como políticas de acesso a linhas e políticas de mascaramento de dados.