Mit gespeicherten Prozeduren arbeiten

Eine gespeicherte Prozedur ist eine Sammlung von Anweisungen, die von anderen Abfragen oder gespeicherten Prozeduren aufgerufen werden können. Eine Prozedur kann Eingabeargumente annehmen und Werte als Ausgabe zurückgeben. Prozeduren werden in einem BigQuery-Dataset benannt und gespeichert. Eine gespeicherte Prozedur kann auf Daten in mehreren Datasets von mehreren Nutzern zugreifen oder diese ändern. Sie kann auch eine Abfrage mit mehreren Anweisungen enthalten.

Einige gespeicherte Prozeduren sind in BigQuery eingebunden und müssen nicht erstellt werden. Diese werden als Systemprozeduren bezeichnet. Weitere Informationen hierzu finden Sie in der Referenz zu Systemprozeduren.

Gespeicherte Prozeduren unterstützen prozedurale Sprachanweisungen, mit denen Sie beispielsweise Variablen definieren und den Ablauf steuern können. Weitere Informationen zu Anweisungen in der prozeduralen Sprache finden Sie in der Referenz zu prozeduralen Sprachen.

Gespeicherte Prozedur erstellen

Verwenden Sie zum Erstellen eines Datasets die Anweisung CREATE PROCEDURE.

Im folgenden konzeptionellen Beispiel stellt procedure_name die Prozedur dar und der Text der Prozedur wird zwischen den Anweisungen BEGIN und END angezeigt:

CREATE PROCEDURE dataset_name.procedure_name
BEGIN
-- statements here
END

Im folgenden Beispiel wird eine Prozedur mit einer Abfrage mit mehreren Anweisungen dargestellt. Die Abfrage mit mehreren Anweisungen legt eine Variable fest, führt eine INSERT-Anweisung aus und zeigt das Ergebnis als formatierten Textstring an.

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

Im vorherigen Beispiel lautet der Name der Prozedur mydataset.create_customer. Der Prozedurtext erscheint zwischen den Anweisungen BEGIN und END.

Verwenden Sie die Anweisung CALL, um die Prozedur aufzurufen:

CALL mydataset.create_customer();

Wert mit Eingabeparameter übergeben

Eine Prozedur kann Eingabeparameter haben. Ein Eingabeparameter ermöglicht die Eingabe für eine Prozedur, aber keine Ausgabe.

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

Wert mit Ausgabeparameter übergeben

Eine Prozedur kann Ausgabeparameter haben. Ein Ausgabeparameter gibt einen Wert aus der Prozedur zurück, lässt jedoch keine Eingabe für die Prozedur zu. Verwenden Sie zum Erstellen eines Ausgabeparameters das Schlüsselwort OUT vor dem Namen des Parameters.

Diese Version der Prozedur gibt beispielsweise die neue Kundennummer mit dem Parameter id zurück:

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

Zum Aufrufen dieser Prozedur müssen Sie eine Variable verwenden, um den Ausgabewert zu erhalten:

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

Wert mit Eingabe-/Ausgabeparameter übergeben

Eine Prozedur kann auch Eingabe-/Ausgabeparameter haben. Ein Eingabe-/Ausgabeparameter gibt einen Wert der Prozedur zurück und akzeptiert auch eine Eingabe für die Prozedur. Verwenden Sie zum Erstellen eines Eingabe-/Ausgabeparameters das Keyword INOUT vor dem Namen des Parameters. Weitere Informationen finden Sie unter Argumentmodus.

Gespeicherte Prozedur aufrufen

Verwenden Sie die Anweisung CALL, um eine gespeicherte Prozedur nach dem Erstellen aufzurufen. Mit der folgenden Anweisung wird beispielsweise die gespeicherte Prozedur create_customer aufgerufen:

CALL mydataset.create_customer();

Systemprozedur aufrufen

Mit der Anweisung CALL können Sie eine integrierte Systemprozedur aufrufen. Mit der folgenden Anweisung wird beispielsweise die Systemprozedur BQ.REFRESH_MATERIALIZED_VIEW aufgerufen:

CALL BQ.REFRESH_MATERIALIZED_VIEW;