使用 SQL 預存程序

預存程序是一組陳述式,可從其他查詢或其他預存程序中呼叫。程序可以接受輸入引數,並將值做為輸出內容傳回。您可以在 BigQuery 資料集中命名及儲存程序。儲存程序可讓多位使用者存取或修改多個資料集的資料。也可以包含多個陳述式查詢

部分預存程序已內建於 BigQuery,因此不需要建立。這些稱為系統程序,您可以參閱系統程序參考資料,進一步瞭解這些程序。

預存程序支援程序語言陳述式,可讓您執行定義變數和實作控管流程等操作。如要進一步瞭解程序語言陳述式,請參閱程序語言參考資料

建立預存程序

如要建立程序,請使用 CREATE PROCEDURE 陳述式。

在以下概念範例中,procedure_name 代表程序,程序的主體則會顯示在 BEGINEND 陳述式之間:

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 關鍵字。詳情請參閱「引數模式」。

授權處理常式

您可以將預存程序授權為例程。授權例行程序可讓您與特定使用者或群組分享查詢結果,而不用為他們提供產生結果的基礎資料表存取權。舉例來說,授權例行程序可以計算資料的匯總值,或查詢資料表值,並在運算中使用該值。

授權例行程序可以建立刪除操作資料表,以及在基礎資料表上叫用其他預存程序

詳情請參閱「已授權的日常生活動作」。

呼叫預存程序

如要在已建立的儲存程序後呼叫該程序,請使用 CALL 陳述式。例如,下列陳述式會呼叫預存程序 create_customer

CALL mydataset.create_customer();

呼叫系統程序

如要呼叫內建系統程序,請使用 CALL 陳述式。例如,下列陳述式會呼叫系統程序 BQ.REFRESH_MATERIALIZED_VIEW

CALL BQ.REFRESH_MATERIALIZED_VIEW;