Trabalhe com procedimentos armazenados de SQL

Um procedimento armazenado é uma coleção de declarações que podem ser chamadas a partir de outras consultas ou outros procedimentos armazenados. Um procedimento pode receber argumentos de entrada e devolver valores como saída. Dá um nome e armazena um procedimento num conjunto de dados do BigQuery. Um procedimento armazenado pode aceder ou modificar dados em vários conjuntos de dados por vários utilizadores. Também pode conter uma consulta com várias declarações.

Alguns procedimentos armazenados estão integrados no BigQuery e não precisam de ser criados. Estes são denominados procedimentos do sistema e pode saber mais acerca deles na referência de procedimentos do sistema.

Os procedimentos armazenados suportam declarações de linguagem processual, que lhe permitem fazer ações como definir variáveis e implementar o fluxo de controlo. Pode saber mais acerca das declarações de linguagem processual na referência de linguagem processual.

Crie um procedimento armazenado

Para criar um procedimento, use a declaração CREATE PROCEDURE.

No exemplo conceptual seguinte, procedure_name representa o procedimento e o corpo do procedimento aparece entre as declarações BEGIN e END:

CREATE PROCEDURE dataset_name.procedure_name()
BEGIN
-- statements here
END

O exemplo seguinte mostra um procedimento que contém uma consulta com várias declarações. A consulta com várias declarações define uma variável, executa uma declaração INSERT e apresenta o resultado como uma string de texto formatada.

CREATE OR REPLACE PROCEDURE mydataset.create_customer()
BEGIN
  DECLARE id STRING;
  SET id = GENERATE_UUID();
  INSERT INTO mydataset.customers (customer_id)
    VALUES(id);
  SELECT FORMAT("Created customer %s", id);
END

No exemplo anterior, o nome do procedimento é mydataset.create_customer e o corpo do procedimento aparece entre as declarações BEGIN e END.

Para chamar o procedimento, use a declaração CALL:

CALL mydataset.create_customer();

Transmita um valor com um parâmetro de entrada

Um procedimento pode ter parâmetros de entrada. Um parâmetro de entrada permite a entrada para um procedimento, mas não permite a saída.

CREATE OR REPLACE PROCEDURE mydataset.create_customer(name STRING)
BEGIN
DECLARE id STRING;
SET id = GENERATE_UUID();
INSERT INTO mydataset.customers (customer_id, name)
  VALUES(id, name);
SELECT FORMAT("Created customer %s (%s)", id, name);
END

Transmita um valor com um parâmetro de saída

Um procedimento pode ter parâmetros de saída. Um parâmetro de saída devolve um valor do procedimento, mas não permite a entrada para o procedimento. Para criar um parâmetro de saída, use a palavra-chave OUT antes do nome do parâmetro.

Por exemplo, esta versão do procedimento devolve o ID do novo cliente através do parâmetro id:

CREATE OR REPLACE PROCEDURE mydataset.create_customer(name STRING, OUT id STRING)
BEGIN
SET id = GENERATE_UUID();
INSERT INTO mydataset.customers (customer_id, name)
  VALUES(id, name);
SELECT FORMAT("Created customer %s (%s)", id, name);
END

Para chamar este procedimento, tem de usar uma variável para receber o valor de saída:

--- Create a new customer record.
DECLARE id STRING;
CALL mydataset.create_customer("alice",id);

--- Display the record.
SELECT * FROM mydataset.customers
WHERE customer_id = id;

Transmita um valor com um parâmetro de entrada/saída

Um procedimento também pode ter parâmetros de entrada/saída. Um parâmetro de entrada/saída devolve um valor do procedimento e também aceita entradas para o procedimento. Para criar um parâmetro de entrada/saída, use a palavra-chave INOUT antes do nome do parâmetro. Para mais informações, consulte o artigo Modo de argumento.

Autorize rotinas

Pode autorizar procedimentos armazenados como rotinas. As rotinas autorizadas permitem-lhe partilhar resultados de consultas com utilizadores ou grupos específicos sem lhes conceder acesso às tabelas subjacentes que geraram os resultados. Por exemplo, uma rotina autorizada pode calcular uma agregação sobre dados ou procurar um valor de tabela e usar esse valor num cálculo.

As rotinas autorizadas podem criar, eliminar, e manipular tabelas, bem como invocar outros procedimentos armazenados na tabela subjacente.

Para mais informações, consulte o artigo Rotinas autorizadas.

Chame um procedimento armazenado

Para chamar um procedimento armazenado depois de criado, use a declaração CALL. Por exemplo, a seguinte declaração chama o procedimento armazenado create_customer:

CALL mydataset.create_customer();

Chame um procedimento do sistema

Para chamar um procedimento do sistema integrado, use a declaração CALL. Por exemplo, a seguinte declaração chama o procedimento do sistema BQ.REFRESH_MATERIALIZED_VIEW:

CALL BQ.REFRESH_MATERIALIZED_VIEW;