Utilizzare le stored procedure
Una stored procedure è una raccolta di istruzioni che possono essere richiamate da altre query o da altre stored procedure. Una procedura può assumere argomenti di input e restituire valori come output. Denomina e archivi una procedura in un set di dati BigQuery. Una stored procedure può accedere o modificare i dati in più set di dati da più utenti. Può anche contenere una query con più istruzioni.
Alcune stored procedure sono integrate in BigQuery e non devono essere create. Queste operazioni sono chiamate procedure di sistema e puoi scoprire di più nella relativa guida di riferimento alle procedure di sistema.
Le stored procedure supportano le istruzioni del linguaggio procedurale, che consentono di definire variabili e implementare un flusso di controllo. Per ulteriori informazioni sulle dichiarazioni linguistice procedurali, consulta la pagina Riferimento linguaggio di procedura.
Creare una stored procedure
Per creare una procedura, utilizza l'istruzione CREATE PROCEDURE
.
Nel seguente esempio concettuale, procedure_name
rappresenta la procedura e il corpo della procedura viene visualizzato tra le istruzioni BEGIN
e END
:
CREATE PROCEDURE dataset_name.procedure_name
BEGIN
-- statements here
END
L'esempio seguente mostra una procedura contenente una query con più dichiarazioni.
La query multi-istruzione imposta una variabile, esegue un'istruzione INSERT
e mostra il risultato come stringa di testo formattata.
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
Nell'esempio precedente, il nome della procedura è
mydataset.create_customer
e il corpo della procedura viene visualizzato tra le istruzioni
BEGIN
e
END
.
Per chiamare la procedura, utilizza l'istruzione CALL
:
CALL mydataset.create_customer();
Trasmettere un valore con un parametro di input
Una procedura può avere parametri di input. Un parametro di input consente l'input di una procedura, ma non l'output.
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
Trasmettere un valore con un parametro di output
Una procedura può avere parametri di output. Un parametro di output restituisce un valore dalla procedura, ma non consente input per la procedura. Per creare un parametro di output, utilizza la parola chiave OUT
prima del nome del parametro.
Ad esempio, questa versione della procedura restituisce il nuovo ID cliente tramite il parametro 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
Per richiamare questa procedura, devi utilizzare una variabile per ricevere il valore di output:
--- Create a new customer record.
DECLARE id STRING;
CALL mydataset.create_customer("alice",id);
--- Display the record.
SELECT * FROM temp.customers
WHERE customer_id = id;
Passaggio di un valore in entrata e in uscita con un parametro di input/output
Una procedura può anche avere parametri di input/output. Un parametro input/output
restituisce un valore dalla procedura e accetta anche l'input per la procedura. Per creare un parametro di input/output, utilizza la parola chiave INOUT
prima del nome del parametro. Per ulteriori informazioni, consulta la sezione Modalità di argomento.
Chiamare una stored procedure
Per chiamare una stored procedure dopo la creazione, utilizza l'istruzione CALL
.
Ad esempio, la seguente istruzione chiama la stored procedure
create_customer
:
CALL mydataset.create_customer();
Chiamata a una procedura di sistema
Per chiamare una procedura di sistema integrata, utilizza l'istruzione CALL
.
Ad esempio, la seguente dichiarazione chiama la procedura di sistema
BQ.REFRESH_MATERIALIZED_VIEW
:
CALL BQ.REFRESH_MATERIALIZED_VIEW;