다음을 통해 공유


프로시저 호출

프로시저는 데이터 소스에 저장되어 있는 실행 가능한 개체입니다. 일반적으로 미리 컴파일된 하나 이상의 SQL 문입니다. 프로시저를 호출하기 위한 이이스케이프 시퀀스는 다음과 같습니다

{[?=]call procedure-name[([parameter][,[parameter]]...)]}

여기에서 procedure-name은 프로시저의 이름을 지정하며 매개변수는 프로시저 매개변수를 지정합니다.

프로시저 호출 이스케이프 시퀀스에 대한 자세한 정보는 부록 C: 구조적 쿼리 언어 문법의 프로시저 호출 이스케이프 시퀀스를 참고해 주세요.

프로시저에는 0개 이상의 매개 변수를 가질 수 있습니다. 혹은 구문을 시작할 때 선택적 매개 변수 마커 ?= 에 표시된 대로 값을 반환할 수도 있습니다. 매개 변수가 입력 혹은 입력 및 출력 매개 변수인 경우에는 리터럴 혹은 매개 변수 마커일 수 있습니다. 그러나 일부 데이터 소스는 이 리터럴 매개 변수 값을 허용하지 않기 때문에 상호 운용 가능한 애플리케이션은 항상 매개 변수 마커를 사용해야 합니다. 매개 변수가 출력 매개 변수인 경우에는 매개 변수 마커여야 합니다. 프로시저 호출 문이 실행되기 이전에 매개 변수 마커를 SQLBindParameter 와 바인딩해야 합니다.

입력이나 입력 및 출력 매개 변수는 프로시저 호출에서 생략될 수 있습니다. 괄호를 가지고 있지만 {call procedure-name()}과 같은 매개 변수가 없이 프로시저가 호출하는 경우에는 드라이버는 데이터 소스에 첫 번째 매개 변수에 대한 기본값을 사용하도록 지시합니다. 프로시저가 매개 변수를 가지고 있지 않을 경우에는 프로시저가 실패할 수 있습니다. 괄호를 가지고 있지 않지만 {call procedure-name}과 같은 프로시저를 호출하는 경우에는 드라이버는 매개 변수의 값을 전송하지 않습니다.

프로시저 호출 시 리터럴을 입력 및 입/출력 매개 변수로 지정할 수 있습니다. 예를 들면, InsertOrder 프로시저에 입력 매개 변수 다섯 개가 있다고 가정해 보세요. InsertOrder에 대한 다음 호출은 첫 번째 매개 변수를 생략하며 두 번째 매개 변수에 대한 리터럴을 제공해 주고 세 번째, 네 번째 및 다섯 번째 매개 변수에 대한 매개 변수 마커를 사용해 주세요:

{call InsertOrder(, 10, ?, ?, ?)}   // Not interoperable!  

매개 변수를 생략되는 경우에는 다른 매개 변수에서 구분해 주는 쉼표가 계속 나타나야 합니다. 입력 혹은 입력 및 출력 매개 변수를 생략되는 경우에는 프로시저에서 매개 변수의 기본값을 사용해 주세요. 입력 혹은 입력 및 출력 매개 변수의 기본값을 지정하기 위한 또 다른 방법으로는 매개 변수에 바인딩 된 길이 및 지시자 버퍼의 값을 SQL_DEFAULT_PARAM으로 설정하는 것입니다.

입력 및 출력 매개 변수가 생략되었거나 매개 변수에 리터럴이 제공된 경우라면 드라이버는 출력 값을 제거합니다. 마찬가지로, 프로시저의 반환 값에 대한 매개 변수 마커가 생략되는 경우 드라이버는 반환 값을 제거합니다. 마지막으로, 애플리케이션이 값을 반환하지 않는 프로시저에 대한 반환 값 매개 변수를 지정하는 경우라면 드라이버는 매개 변수에 바인딩된 길이 및 지시자 버퍼의 값을 SQL_NULL_DATA로 설정해 주세요.

PARTS_IN_ORDERS 프로시저가 특정 부품 번호를 포함되어 있는 주문 목록이 포함된 결과 집합을 만들어 본다고 가정해 보세요. 다음 코드는 부품 번호 544부에 대해 이 프로시저를 호출해 주세요:

SQLUINTEGER   PartID;  
SQLINTEGER    PartIDInd = 0;  
  
// Bind the parameter.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0,  
                  &PartID, 0, PartIDInd);  
  
// Place the department number in PartID.  
PartID = 544;  
  
// Execute the statement.  
SQLExecDirect(hstmt, "{call PARTS_IN_ORDERS(?)}", SQL_NTS);  

데이터 소스가 프로시저를 지원하고 있는지 확인하기 위해 애플리케이션은 SQL_PROCEDURES 옵션을 사용하여 SQLGetInfo를 호출해 주세요.

프로시저에 대한 자세한 정보는 프로시저를 참고해 주세요.