다음을 통해 공유


준비된 실행 ODBC

준비된 실행은 문을 두 번 이상 실행하는 효율적인 방법입니다. 문은 먼저 액세스 계획으로 컴파일되거나 준비 됩니다. 그런 다음 액세스 계획은 나중에 하나 이상 실행됩니다. 액세스 계획에 대한 자세한 내용은 SQL 문 처리를 참조 하세요.

준비된 실행은 일반적으로 수직 및 사용자 지정 애플리케이션에서 매개 변수가 있는 동일한 SQL 문을 반복적으로 실행하는 데 사용됩니다. 예를 들어 다음 코드는 여러 파트의 가격을 업데이트하는 문을 준비합니다. 그런 다음 매번 서로 다른 매개 변수 값을 사용하여 문을 여러 번 실행합니다.

SQLREAL       Price;  
SQLUINTEGER   PartID;  
SQLINTEGER    PartIDInd = 0, PriceInd = 0;  
  
// Prepare a statement to update salaries in the Employees table.  
SQLPrepare(hstmt, "UPDATE Parts SET Price = ? WHERE PartID = ?", SQL_NTS);  
  
// Bind Price to the parameter for the Price column and PartID to  
// the parameter for the PartID column.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0,  
                  &Price, 0, &PriceInd);  
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 10, 0,  
                  &PartID, 0, &PartIDInd);  
  
// Repeatedly execute the statement.  
while (GetPrice(&PartID, &Price)) {  
   SQLExecute(hstmt);  
}  

준비된 실행은 주로 문이 한 번만 컴파일되기 때문에 두 번 이상 실행된 문에 대한 직접 실행보다 빠릅니다. 직접 실행된 문은 실행될 때마다 컴파일됩니다. 또한 데이터 원본이 액세스 계획 식별자를 지원하는 경우 드라이버가 전체 SQL 문이 아니라 문이 실행될 때마다 데이터 원본에 액세스 계획 식별자를 보낼 수 있으므로 준비된 실행은 네트워크 트래픽을 감소할 수 있습니다.

애플리케이션은 문이 준비되고 실행되기 전에 결과 집합에 대한 메타데이터를 검색할 수 있습니다. 그러나 일부 드라이버의 경우 준비되고 실행되지 않은 문에 대한 메타데이터를 반환하는 것은 비용이 많이 들며 가능한 경우 상호 운용 가능한 애플리케이션에서 피해야 합니다. 자세한 내용은 결과 집합 메타데이터를 참조하세요.

준비된 실행은 한 번 실행된 문에 사용하면 안 됩니다. 이러한 문의 경우 추가 ODBC 함수 호출이 필요하기 때문에 직접 실행보다 약간 느립니다.

Important

SQLEndTran을 명시적으로 호출하거나 자동 커밋 모드에서 작업하여 트랜잭션을 커밋하거나 롤백하면 일부 데이터 원본이 연결의 모든 문에 대한 액세스 계획을 삭제합니다. 자세한 내용은 SQLGetInfo 함수 설명의 SQL_CURSOR_COMMIT_BEHAVIOR 및 SQL_CURSOR_ROLLBACK_BEHAVIOR 옵션을 참조하세요.

문을 준비하고 실행하기 위해 애플리케이션은 다음을 수행합니다.

  1. SQLPrepare를 호출하고 SQL 문을 포함하는 문자열을 전달합니다.

  2. 매개 변수의 값을 설정합니다. 매개 변수는 실제로 문을 준비하기 전이나 후에 설정할 수 있습니다. 자세한 내용은 이 섹션의 뒷부분에 있는 문 매개 변수를 참조하세요.

  3. SQLExecute를 호출하고 데이터 가져오기와 같이 필요한 추가 처리를 수행합니다.

  4. 필요에 따라 2단계와 3단계를 반복합니다.

  5. SQLPrepare이 호출되면 드라이버는 다음과 같습니다.

    • 문을 구문 분석하지 않고 데이터 원본의 SQL 문법을 사용하도록 SQL 문을 수정합니다. 여기에는 ODBC의 이스케이프 시퀀스에서 설명하는 이스케이프 시퀀스 바꾸기가 포함됩니다. 애플리케이션은 SQLNativeSql을 호출하여 SQL 문의 수정된 형식을 검색할 수 있습니다. 이스케이프 시퀀스는 SQL_ATTR_NOSCAN 문 특성이 설정된 경우 대체되지 않습니다.

    • 준비를 위해 문을 데이터 원본으로 보냅니다.

    • 나중에 실행하기 위해 반환된 액세스 계획 식별자를 저장하거나(준비에 성공한 경우) 오류를 반환합니다(준비에 실패한 경우). 오류에는 SQLSTATE 42000(구문 오류 또는 액세스 위반) 및 SQLSTATE 42S02와 같은 의미 체계 오류(기본 테이블 또는 뷰를 찾을 수 없음)와 같은 구문 오류가 포함됩니다.

      참고 항목

      일부 드라이버는 이 시점에서 오류를 반환하지 않고 문이 실행되거나 카탈로그 함수가 호출될 때 오류를 반환합니다. 따라서 실제로 실패한 경우 SQLPrepare가 성공한 것처럼 보일 수 있습니다.

  6. SQLExecute가 호출되면 드라이버는 다음과 같습니다.

    • 현재 매개 변수 값을 검색하고 필요에 따라 변환합니다. 자세한 내용은 이 섹션의 뒷부분에 있는 문 매개 변수를 참조하세요.

    • 액세스 계획 식별자 및 변환된 매개 변수 값을 데이터 원본으로 보냅니다.

    • 오류를 반환합니다. 일반적으로 SQLSTATE 24000(잘못된 커서 상태)과 같은 런타임 오류입니다. 그러나 일부 드라이버는 이 시점에서 구문 및 의미 체계 오류를 반환합니다.

데이터 원본이 문 준비를 지원하지 않는 경우 드라이버는 가능한 한 에뮬레이트해야 합니다. 예를 들어 SQLPrepare가 호출될 때 드라이버는 아무 작업도 수행하지 않을 수 있으며 SQLExecute가 호출될 때 문의 직접 실행을 수행할 수 있습니다.

데이터 원본이 실행 없이 구문 검사를 지원하는 경우 드라이버는 SQLPrepare가 호출되는 시기를 확인하기 위한 문을 제출하고 SQLExecute가 호출될 때 실행을 위해 문을 제출할 수 있습니다.

드라이버가 문 준비를 에뮬레이트할 수 없는 경우 SQLPrepare이 호출될 때 문을 저장하고 SQLExecute가 호출될 때 실행을 위해 제출합니다.

에뮬레이트된 문 준비는 완벽하지 않으므로 SQLExecute는 SQLPrepare에서 일반적으로 반환되는 오류를 반환할 수 있습니다.