

 Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、[ブログ記事](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)を参照してください。

# CALL
<a name="r_CALL_procedure"></a>

ストアドプロシージャを実行します。CALL コマンドには、プロシージャ名と入力引数の値を含める必要があります。CALL ステートメントを使用してストアドプロシージャを呼び出す必要があります。

**注記**  
CALL を通常のクエリの一部にすることはできません。

## 構文
<a name="r_CALL_procedure-synopsis"></a>

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

## パラメータ
<a name="r_CALL_procedure-parameters"></a>

 *sp\$1name*   
実行するプロシージャの名前。

 *argument*   
入力引数の値。このパラメータは、関数名 (`pg_last_query_id()`) とすることもできます。クエリは CALL の引数として使用できません。

## 使用に関する注意事項
<a name="r_CALL_procedure-usage-notes"></a>

Amazon Redshift のストアドプロシージャは、以下に説明するように、ネストされた呼び出しと再帰呼び出しをサポートしています。さらに、以下に説明するように、ドライバーのサポートが最新であることを確認します。

**Topics**
+ [ネストされた呼び出し](#r_CALL_procedure-nested-calls)
+ [ドライバーのサポート](#r_CALL_procedure-driver-support)

### ネストされた呼び出し
<a name="r_CALL_procedure-nested-calls"></a>

Amazon Redshift のストアドプロシージャは、ネストされた呼び出しと再帰呼び出しをサポートしています。ネストレベルの最大許容数は 16 です。ネストされた呼び出しは、ビジネスロジックをより小さいプロシージャにカプセル化できます。これらのプロシージャを複数の発信者が共有できます。

ネストされたプロシージャに出力パラメータが含まれていると、このプロシージャを呼び出す場合、内部プロシージャは INOUT 引数を定義する必要があります。この場合、内部プロシージャを非定数変数で渡す必要があります。OUT 引数は許可されません。この動作が発生するのは、内部呼び出しの出力を保持するために変数が必要であるためです。

内部プロシージャと外部プロシージャの関係は、[SVL\$1STORED\$1PROC\$1CALL](r_SVL_STORED_PROC_CALL.md)の `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)
```

### ドライバーのサポート
<a name="r_CALL_procedure-driver-support"></a>

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

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

最新バージョンの Amazon Redshift JDBC ドライバーと ODBC ドライバーには、ストアドプロシージャを検出するためのメタデータサポートが含まれています。カスタム Java アプリケーション用の `CallableStatement` サポートも含まれています。ドライバーの詳細については、「*Amazon Redshift 管理ガイド*」の「[SQL クライアントツールを使用して Amazon Redshift クラスターに接続する](https://docs.aws.amazon.com/redshift/latest/mgmt/connecting-to-cluster.html)」を参照してください。

以下の例は、ストアドプロシージャ呼び出しで 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);
}
```

## 例
<a name="r_CALL_procedure-examples"></a>

次の例では、プロシージャ名 `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)
```