

 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*   
실행할 프로시저의 이름입니다.

 *인수*   
입력 인수의 값입니다. 이 파라미터도 함수 이름일 수 있습니다(예: `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 인수는 허용되지 않습니다. 내부 호출의 출력을 보관하는 데 변수가 필요하기 때문에 이 동작이 발생합니다.

내부 프로시저와 외부 프로시저 간의 관계는 `from_sp_call`의 [SVL\$1STORED\$1PROC\$1CALL](r_SVL_STORED_PROC_CALL.md) 열에 기록됩니다.

다음 예에서는 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 저장 프로시저를 지원하는 최신 버전으로 업그레이드하는 것이 좋습니다.

클라이언트 도구가 CALL 문을 통해 서버로 전달하는 드라이버 API 작업을 사용하는 경우 기존 드라이버를 사용할 수 있습니다. 출력 파라미터(있는 경우)는 한 행의 결과 세트로 반환됩니다.

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)
```