Amazon Redshift
データベース開発者ガイド

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_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 Database Connectivity (JDBC) ドライバーと Open Database Connectivity (ODBC) ドライバーを、Amazon Redshift のストアドプロシージャをサポートする最新バージョンにアップグレードすることをお勧めします。

クライアントツールで使用しているドライバーの API オペレーションが CALL ステートメントをサーバーにパススルーする場合は、既存のドライバーを使用できることがあります。出力パラメータ (ある場合) は、1 行の結果セットとして返されます。

最新バージョンの Amazon Redshift JDBC ドライバーと ODBC ドライバーには、ストアドプロシージャを検出するためのメタデータサポートが含まれています。カスタム Java アプリケーション用の CallableStatement サポートも含まれています。ドライバーの詳細については、「SQL クライアントツールを使用して Amazon Redshift クラスターに接続する」 (Amazon Redshift Cluster Management Guide) を参照してください。

重要

現在、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)