本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
CALL
執行預存程序。CALL 命令必須包含程序名稱和輸入引數值。您必須使用 CALL 陳述式來呼叫預存程序。
注意
CALL 不能是任何一般查詢的一部分。
語法
CALL sp_name ( [ argument ] [, ...] )
參數
- sp_name
-
要執行的程序的名稱。
- argument
-
輸入引數的值。此參數也可以是函數名稱,例如
pg_last_query_id()
。您不能將查詢當作 CALL 引數。
使用須知
Amazon Redshift 預存程序支援巢狀和遞迴呼叫,如下所述。此外,請確定您的驅動程序支援是最新版,亦如下所述。
巢狀呼叫
Amazon Redshift 預存程序支援巢狀和遞迴呼叫。允許的巢狀層級數目上限為 16。巢狀呼叫可以將商業邏輯封裝成較小的程序,供多個發起人共用。
如果您呼叫的巢狀程序有輸出參數,則內部程序必須定義 INOUT 引數。在此情況下,非常數變數會傳入內部程序中。不允許 OUT 引數。發生此行為是因為需要變數來保留內部呼叫的輸出。
內層和外層程序的關係記錄在 SVL_STORED_PROC_CALL 的 from_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
。如需驅動程式的相關資訊,請參閱《Amazon Redshift 管理指南》中的使用 SQL 用戶端工具連線至 Amazon Redshift 叢集。
下列範例顯示如何在預存程序呼叫中使用 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)