SQL ストアド プロシージャを使用する

ストアド プロシージャは、他のクエリまたはストアド プロシージャから呼び出すことができるステートメントの集合です。プロシージャは、入力引数を受け取り、出力として値を返すことができます。プロシージャに名前を付け、BigQuery データセットに保存します。ストアド プロシージャでは、複数のユーザーが複数のデータセットのデータにアクセスしたり、データを変更したりできます。また、複数ステートメント クエリを含めることもできます。

一部のストアド プロシージャは BigQuery に組み込まれており、作成する必要はありません。これらをシステム プロシージャと呼びます。詳細については、システム プロシージャ リファレンスをご覧ください。

ストアド プロシージャは手続き型言語ステートメントをサポートしているため、変数の定義や制御フローの実装などを行えます。手続き型言語ステートメントの詳細については、手続き型言語リファレンスをご覧ください。

ストアド プロシージャを作成する

プロシージャを作成するには、CREATE PROCEDURE ステートメントを使用します。

次の概念例では、procedure_name がプロシージャを表し、プロシージャの本文は BEGIN ステートメントと END ステートメントの間にあります。

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

次の例は、複数ステートメント クエリを含むプロシージャを示しています。 複数ステートメント クエリは、変数を設定し、INSERT ステートメントを実行して、書式設定されたテキスト文字列として結果を表示します。

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

上記の例では、プロシージャの名前は mydataset.create_customer で、プロシージャの本文は BEGINEND ステートメントの間にあります。

プロシージャを呼び出すには、CALL ステートメントを使用します。

CALL mydataset.create_customer();

入力パラメータを使用して値を渡す

プロシージャには入力パラメータを指定できます。入力パラメータでは、プロシージャの入力が許可されますが、出力は許可されません。

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

出力パラメータを使用して値を渡す

プロシージャには出力パラメータを含めることができます。出力パラメータは、プロシージャから値を返しますが、プロシージャの入力はできません。出力パラメータを作成するには、パラメータの名前の前に OUT キーワードを使用します。

たとえば、このバージョンのプロシージャでは、id パラメータを使用して新規顧客 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

このプロシージャを呼び出すには、変数を使用して出力値を取得する必要があります。

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

入出力パラメータを使用して値を渡す

プロシージャには、入出力パラメータを含めることもできます。入出力パラメータは、プロシージャから値を返し、プロシージャの入力も受け入れます。入出力パラメータを作成するには、パラメータの名前の前に INOUT キーワードを使用します。詳細については、引数モードをご覧ください。

ルーティンを承認

ストアド プロシージャは、ルーティンとして承認できます。承認済みルーティンを使用すると、特定のユーザーまたはグループに基になるテーブルへのアクセス権を付与せずに、そのユーザーまたはグループとクエリ結果を共有できます。たとえば、認可済みのルーティンを使用すると、データの集計を行うことができます。また、テーブル値の検索を行い、その値を計算で使用することもできます。

ルーティンとして承認されたストアド プロシージャを使用すると、基になるテーブルに対してデータ操作言語(DML)のステートメントを実行することもできます。

詳細については、承認済みルーティンをご覧ください。

ストアド プロシージャを呼び出す

作成後にストアド プロシージャを呼び出すには、CALL ステートメントを使用します。 たとえば、次のステートメントではストアド プロシージャ create_customer を呼び出しています。

CALL mydataset.create_customer();

システム プロシージャを呼び出す

組み込みシステム プロシージャを呼び出すには、CALL ステートメントを使用します。 たとえば、次のステートメントではシステム プロシージャ BQ.REFRESH_MATERIALIZED_VIEW を呼び出します。

CALL BQ.REFRESH_MATERIALIZED_VIEW;