CALL - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

CALL

執行預存程序。CALL 命令必須包含程序名稱和輸入引數值。您必須使用 CALL 陳述式來呼叫預存程序。CALL 不能是任何一般查詢的一部分。

Syntax (語法)

CALL sp_name ( [ argument ] [, ...] )

參數

sp_name

要執行的程序的名稱。

argument

輸入引數的值。此參數也可以是函數名稱,例如 pg_last_query_id()。您不能將查詢當作 CALL 引數。

使用須知

Amazon Redshift 儲存過程支援嵌套和遞迴調用,如下所述。此外,請確定您的驅動程序支援是最新版,亦如下所述。

巢狀呼叫

Amazon Redshift 存儲程序支援巢狀和遞迴呼叫。允許的巢狀層級數目上限為 16。巢狀呼叫可以將商業邏輯封裝成較小的程序,供多個發起人共用。

如果您呼叫的巢狀程序有輸出參數,則內部程序必須定義 INOUT 引數。在此情況下,非常數變數會傳入內部程序中。不允許 OUT 引數。發生此行為是因為需要變數來保留內部呼叫的輸出。

內層和外層程序的關係記錄在 SVL_STORED_PROC_CALLfrom_sp_call 欄。

下列範例顯示透過 INOUT 引數將變數傳給巢狀程序。

CREATE OR REPLACE PROCEDURE inner_proc(INOUT a int, b int, INOUT c int) LANGUAGE plpgsql AS $$ BEGIN a := b * a; c := b * c; END; $$; CREATE OR REPLACE PROCEDURE outer_proc(multiplier int) LANGUAGE plpgsql AS $$ DECLARE x int := 3; y int := 4; BEGIN DROP TABLE IF EXISTS test_tbl; CREATE TEMP TABLE test_tbl(a int, b varchar(256)); CALL inner_proc(x, multiplier, y); insert into test_tbl values (x, y::varchar); END; $$; CALL outer_proc(5); SELECT * from test_tbl; a | b ----+---- 15 | 20 (1 row)

驅動程式支援

建議您將 Java 資料庫連線 (JDBC) 和開放式資料庫連線 (ODBC) 驅動程式升級至支援 Amazon Redshift 儲存程序的最新版本。

如果您的用戶端工具使用驅動程式 API 操作將 CALL 陳述式傳遞到伺服器,您或許能夠使用現有的驅動程式。傳回的輸出參數 (若有) 是一列的結果集。

最新版本的 Amazon Redshift JDBC 和 ODBC 驅動程式對於預存程序探索,支援中繼資料。對於自訂 Java 應用程式。還支援 CallableStatement。如需驅動程式的詳細資訊,請參使用 SQL 客户端工具連接至 Amazon Redshift 集羣中的Amazon Redshift 叢集管理指南。

重要

目前,在使用 JDBC 或 ODBC 驅動程式的預存程序中,您無法使用 refcursor 資料類型。

下列範例顯示如何在預存程序呼叫中使用 JDBC 驅動程式的不同 API 操作。

void statement_example(Connection conn) throws SQLException { statement.execute("CALL sp_statement_example(1)"); } void prepared_statement_example(Connection conn) throws SQLException { String sql = "CALL sp_prepared_statement_example(42, 84)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.execute(); } void callable_statement_example(Connection conn) throws SQLException { CallableStatement cstmt = conn.prepareCall("CALL sp_create_out_in(?,?)"); cstmt.registerOutParameter(1, java.sql.Types.INTEGER); cstmt.setInt(2, 42); cstmt.executeQuery(); Integer out_value = cstmt.getInt(1); }

範例

下列範例呼叫程序名稱 test_spl

call test_sp1(3,'book'); INFO: Table "tmp_tbl" does not exist and will be skipped INFO: min_val = 3, f2 = book

下列範例呼叫程序名稱 test_spl2

call test_sp2(2,'2019'); f2 | column2 ---------------------+--------- 2019+2019+2019+2019 | 2 (1 row)