Utilizzare le stored procedure SQL

Una stored procedure è una raccolta di istruzioni che possono essere chiamate da altre query o altre stored procedure. Una procedura può accettare argomenti di input e restituire valori come output. Assegni un nome e memorizzi 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 vengono chiamate procedure di sistema e puoi scoprire di più nella Guida di riferimento alle procedure di sistema.

Le stored procedure supportano le istruzioni del linguaggio procedurale, che ti consentono di definire variabili e implementare il flusso di controllo. Puoi scoprire di più sulle istruzioni del linguaggio procedurale nella Guida di riferimento del linguaggio procedurale.

Crea una stored procedure

Scegli una delle seguenti opzioni per creare una stored procedure:

SQL

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 che contiene una query con più istruzioni. La query con più istruzioni 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();

Terraform

Utilizza la risorsa google_bigquery_routine.

Per eseguire l'autenticazione in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configurare l'autenticazione per le librerie client.

L'esempio seguente crea una stored procedure denominata my_stored_procedure:

# Creates a SQL stored procedure.

# Create a dataset to contain the stored procedure.
resource "google_bigquery_dataset" "my_dataset" {
  dataset_id = "my_dataset"
}

# Create a stored procedure.
resource "google_bigquery_routine" "my_stored_procedure" {
  dataset_id      = google_bigquery_dataset.my_dataset.dataset_id
  routine_id      = "my_stored_procedure"
  routine_type    = "PROCEDURE"
  language        = "SQL"
  definition_body = "SELECT * FROM `bigquery-public-data.ml_datasets.penguins`;"
}

Per applicare la configurazione di Terraform in un progetto Google Cloud , completa i passaggi descritti nelle sezioni seguenti.

Prepara Cloud Shell

  1. Avvia Cloud Shell.
  2. Imposta il progetto Google Cloud predefinito in cui vuoi applicare le configurazioni Terraform.

    Devi eseguire questo comando una sola volta per progetto e puoi eseguirlo in qualsiasi directory.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Le variabili di ambiente vengono sostituite se imposti valori espliciti nel file di configurazione Terraform.

Prepara la directory

Ogni file di configurazione Terraform deve avere la propria directory (chiamata anche modulo radice).

  1. In Cloud Shell, crea una directory e un nuovo file al suo interno. Il nome file deve avere l'estensione .tf, ad esempio main.tf. In questo tutorial, il file viene denominato main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Se stai seguendo un tutorial, puoi copiare il codice campione in ogni sezione o passaggio.

    Copia il codice campione nel main.tf appena creato.

    (Facoltativo) Copia il codice da GitHub. Questa operazione è consigliata quando lo snippet Terraform fa parte di una soluzione end-to-end.

  3. Rivedi e modifica i parametri di esempio da applicare al tuo ambiente.
  4. Salva le modifiche.
  5. Inizializza Terraform. Devi effettuare questa operazione una sola volta per directory.
    terraform init

    (Facoltativo) Per utilizzare l'ultima versione del provider Google, includi l'opzione -upgrade:

    terraform init -upgrade

Applica le modifiche

  1. Rivedi la configurazione e verifica che le risorse che Terraform creerà o aggiornerà corrispondano alle tue aspettative:
    terraform plan

    Apporta le correzioni necessarie alla configurazione.

  2. Applica la configurazione Terraform eseguendo questo comando e inserendo yes al prompt:
    terraform apply

    Attendi che Terraform visualizzi il messaggio "Apply complete!".

  3. Apri il tuo Google Cloud progetto per visualizzare i risultati. Nella console Google Cloud , vai alle risorse nell'interfaccia utente per assicurarti che Terraform le abbia create o aggiornate.

Trasmettere un valore con un parametro di input

Una procedura può avere parametri di input. Un parametro di input consente l'input per una procedura, ma non consente 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

Passare 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 l'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 l'ID nuovo 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 chiamare 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 mydataset.customers
WHERE customer_id = id;

Trasferire un valore in entrata e in uscita con un parametro di input/output

Una procedura può avere anche parametri di input/output. Un parametro di 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 saperne di più, consulta la sezione Modalità argomento.

Autorizzare le routine

Puoi autorizzare le stored procedure come routine. Le routine autorizzate ti consentono di condividere i risultati delle query con utenti o gruppi specifici senza concedere loro l'accesso alle tabelle sottostanti che hanno generato i risultati. Ad esempio, una routine autorizzata può calcolare un'aggregazione sui dati o cercare un valore di tabella e utilizzarlo in un calcolo.

Le routine autorizzate possono creare, eliminare e manipolare tabelle, nonché richiamare altre stored procedure nella tabella sottostante.

Per ulteriori informazioni, vedi Routine autorizzate.

Chiama una stored procedure

Per chiamare una stored procedure dopo la sua creazione, utilizza l'istruzione CALL. Ad esempio, la seguente istruzione chiama la stored procedure create_customer:

CALL mydataset.create_customer();

Chiama una procedura di sistema

Per chiamare una procedura di sistema integrata, utilizza l'istruzione CALL. Ad esempio, la seguente istruzione chiama la procedura di sistema BQ.REFRESH_MATERIALIZED_VIEW:

CALL BQ.REFRESH_MATERIALIZED_VIEW;