使用 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
,程序主體則會顯示在 BEGIN
和 END
陳述式之間。
如要呼叫程序,請使用 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;