CALL
저장 프로시저를 실행합니다. CALL 명령에는 프로시저 이름과 입력 인수 값이 포함되어야 합니다. CALL 문을 사용하여 저장 프로시저를 호출해야 합니다.
참고
CALL은 정규 쿼리의 일부일 수 없습니다.
구문
CALL sp_name ( [ argument ] [, ...] )
파라미터
- sp_name
-
실행할 프로시저의 이름입니다.
- 인수
-
입력 인수의 값입니다. 이 파라미터도 함수 이름일 수 있습니다(예:
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 Database Connectivity(JDBC) 및 Open Database Connectivity(ODBC) 드라이버를 Amazon Redshift 저장 프로시저를 지원하는 최신 버전으로 업그레이드하는 것이 좋습니다.
클라이언트 도구가 CALL 문을 통해 서버로 전달하는 드라이버 API 작업을 사용하는 경우 기존 드라이버를 사용할 수 있습니다. 출력 파라미터(있는 경우)는 한 행의 결과 세트로 반환됩니다.
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)