

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 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 ] [, ...] )
```

## Parameters
<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 資料庫連線 (JDBC) 和開放式資料庫連線 (ODBC) 驅動程式升級到支援 Amazon Redshift 預存程序的最新版本。

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

最新版本的 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)
```