13.2.1 CALL 구문
CALL sp_name
( parameter
[, ...]]) CALL sp_name
[()]
CALL
문은 이전에 CREATE PROCEDURE
를 사용하여 정의 된 저장 프로 시저를 호출합니다.
인수를 취하지 않는 저장 프로 시저는 괄호없이 호출 할 수 있습니다. 즉, CALL p()
와 CALL p
는 동일합니다.
CALL
은 OUT
또는 INOUT
매개 변수로 선언 된 매개 변수를 사용하여 해당 호출자에게 값을 반환 할 수 있습니다. 프로 시저에서 반환 될 때 클라이언트 프로그램 루틴에서 실행 된 마지막 문에서 영향을받은 행수를 취득 할 수 있습니다. SQL 레벨에서 ROW_COUNT()
함수를 호출합니다. C API에서는 mysql_affected_rows()
함수를 호출합니다.
OUT
또는 INOUT
매개 변수를 사용하여 프로 시저에서 값을 검색하려면 사용자 변수를 사용하여이 매개 변수를 전달하여 프로 시저에서 돌아온 뒤에 변수의 값을 확인합니다. (프로 시저를 다른 저장 프로 시저 또는 저장 함수 내에서 호출하는 경우, IN
또는 INOUT
매개 변수로 루틴 파라미터 또는 로컬 루틴 변수를 전달할 수 있습니다.) INOUT
매개 변수의 경우 프로 시저에 전달하기 전에 값을 초기화하십시오. 다음 프로시 저는이 프로 시저가 현재 서버 버전으로 설정 OUT
매개 변수와 프로 시저가 현재 값에서 1 씩 증가 INOUT
값이 포함되어 있습니다.
CREATE PROCEDURE p (OUT ver_param VARCHAR (25) INOUT incr_param INT) BEGIN # Set value of OUT parameter SELECT VERSION () INTO ver_param; # Increment value of INOUT parameter SET incr_param = incr_param + 1; END;
이 프로 시저를 호출하기 전에 INOUT
매개 변수로 전달되는 변수를 초기화합니다. 이 프로 시저를 호출 한 뒤,이 두 변수의 값은 설정 또는 변경되어 있습니다.
mysql>SET @increment = 10;
mysql>CALL p(@version, @increment);
mysql>SELECT @version, @increment;
+--------------+------------+ | @version | @increment | +--------------+------------+ | 5.5.3-m3-log | 11 | +--------------+------------+
PREPARE
및 EXECUTE
에서 사용되는 준비된 CALL
문에서 IN
매개 변수 자리 표시자를 사용할 수 있습니다. OUT
및 INOUT
파라미터의 경우, 플레이스 홀더의 지원은 MySQL 5.5.3 이상에서 사용할 수 있습니다. 이러한 유형의 매개 변수는 다음과 같이 사용할 수 있습니다.
mysql>SET @increment = 10;
mysql>PREPARE s FROM 'CALL p(?, ?)';
mysql>EXECUTE s USING @version, @increment;
mysql>SELECT @version, @increment;
+--------------+------------+ | @version | @increment | +--------------+------------+ | 5.5.3-m3-log | 11 | +--------------+------------+
MySQL 5.5.3 이전에는 OUT
또는 INOUT
매개 변수 자리 표시 자 지원은 사용할 수 없습니다. OUT
및 INOUT
매개 변수에 대한 제한 규정을 피하기 위해 자리 표시자를 사용하지 마십시오. 대신 사용자 변수를 CALL
문 자체에서 참조하고 EXECUTE
문은 지정하지 마십시오.
mysql>SET @increment = 10;
mysql>PREPARE s FROM 'CALL p(@version, @increment)';
mysql>EXECUTE s;
mysql>SELECT @version, @increment;
+--------------+------------+ | @version | @increment | +--------------+------------+ | 5.5.0-m2-log | 11 | +--------------+------------+
CALL
SQL 문을 사용하여 결과 세트를 생성하는 저장 프로 시저를 실행하는 C 프로그램을 작성하려면 CLIENT_MULTI_RESULTS
플래그가 활성화되어 있어야합니다. 이것은 각 CALL
에 의해 프로 시저 내에서 실행되는 문에 의해 반환 될 수있는 결과 세트 이외에 호출 상태를 나타 내기위한 결과가되기 때문입니다. CLIENT_MULTI_RESULTS
는 CALL
이 준비된 명령문이 포함 된 저장 프로 시저를 실행하는 데 사용되는 경우에도 활성화해야합니다. 이러한 프로 시저가 언제로드 될까나 이러한 문에서 결과 집합이 생성되는지 여부를 확인할 수 없기 때문에 이러한 가정해야합니다.
CLIENT_MULTI_RESULTS
는 mysql_real_connect()
를 호출 할 때 CLIENT_MULTI_RESULTS
플래그 자체를 전달하여 명시 적으로 또는 CLIENT_MULTI_STATEMENTS
을 전달하여 암시 적으로 사용하는 (따라서 CLIENT_MULTI_RESULTS
도 적용됩니다) 수 있습니다. MySQL 5.6에서는 CLIENT_MULTI_RESULTS
은 기본적으로 활성화되어 있습니다.
mysql_query()
또는 mysql_real_query()
를 사용하여 실행 된 CALL
문 결과를 처리하려면 그 이상의 결과가 존재하는지 여부를 판정하기 위해서 mysql_next_result()
를 호출하는 루프를 사용하십시오. 예를 들어, 섹션 23.8.17 "여러 문 실행의 C API 지원" 을 참조하십시오.
MySQL 인터페이스를 갖는 언어로 작성된 프로그램의 경우 CALL
문에서 OUT
또는 INOUT
매개 변수의 결과를 직접 얻을 수있는 네이티브 메소드가 MySQL 5.5.3 이전에는 존재하지 않습니다. 이러한 매개 변수 값을 얻으려면, CALL
문에서 프로 시저에 사용자 정의 변수를 건네 준 뒤, SELECT
문을 실행하여 변수 값을 포함한 결과 세트를 생성합니다. INOUT
매개 변수를 처리하려면 CALL
전에 해당 사용자 변수를 프로 시저에 전달되는 값으로 설정하는 명령을 실행하십시오.
다음 예제는 앞서 설명한 OUT
파라미터와 INOUT
파라미터를 포함한 저장 프로 시저 p
의 방법 (오류 검사는 없음)를 보여줍니다.
mysql_query (mysql "SET @increment = 10"); mysql_query (mysql "CALL p (@version, @increment)"); mysql_query (mysql "SELECT @version, @increment"); result = mysql_store_result (mysql); row = mysql_fetch_row (result); mysql_free_result (result);
이전 코드가 실행 된 후 row[0]
과 row[1]
는 각각 @version
과 @increment
값이 포함되어 있습니다.
MySQL 5.6에서는 C 프로그램은 준비된 명령문 인터페이스를 사용하여 CALL
문을 실행하고 OUT
및 INOUT
매개 변수에 액세스 할 수 있습니다. 이것은 더 이상 결과가 존재하는지 여부를 판정하기 위해 mysql_stmt_next_result()
를 호출하는 루프를 사용하여 CALL
문 결과를 처리함으로써 이루어집니다. 예를 들어, 섹션 23.8.20 "C API의 준비된 CALL 문 지원" 을 참조하십시오. MySQL 인터페이스를 갖는 언어는 준비된 CALL
문을 사용하여 OUT
및 INOUT
시저 매개 변수를 직접 얻을 수 있습니다.
MySQL 5.6.6 이후에서는 저장 프로그램에 의해 참조되는 개체에 대한 메타 데이터 변경이 감지되고 프로그램이 다음 실행 때 영향을받는 문 자동 재 해석이 이루어지게됩니다. 자세한 내용은 섹션 8.9.4 "준비된 문 및 저장 프로그램 캐시" 를 참조하십시오.