다음을 통해 공유


문 실행

데이터베이스 엔진에 의해 컴파일(준비)된 시기와 문을 정의하는 사람에 따라 문을 실행하는 네 가지 방법이 있습니다.

  • 직접 실행 애플리케이션은 SQL 문을 정의합니다. 한 단계로 런타임에 준비 및 실행됩니다.

  • 준비된 실행 애플리케이션은 SQL 문을 정의합니다. 이 파일은 별도의 단계로 런타임에 준비 및 실행됩니다. 문을 한 번 준비하고 여러 번 실행할 수 있습니다.

  • 프로시저 애플리케이션은 개발 시 하나 이상의 SQL 문을 정의 및 컴파일하고 이러한 문을 프로시저로 데이터 원본에 저장할 수 있습니다. 프로시저는 런타임에 하나 이상 실행됩니다. 애플리케이션은 카탈로그 함수를 사용하여 사용 가능한 저장 프로시저를 열거할 수 있습니다.

  • Catalog Functions 드라이버 작성기는 미리 정의된 결과 집합을 반환하는 함수를 만듭니다. 일반적으로 이 함수는 미리 정의된 SQL 문을 제출하거나 이 용도로 만든 프로시저를 호출합니다. 함수는 런타임에 하나 이상 실행됩니다.

특정 문(문 핸들로 식별됨)은 여러 번 실행할 수 있습니다. 이 문은 다양한 SQL 문으로 실행하거나 동일한 SQL 문을 사용하여 반복적으로 실행할 수 있습니다. 예를 들어 다음 코드는 동일한 문 핸들(hstmt1)을 사용하여 Sales 데이터베이스의 테이블을 검색하고 표시합니다. 그런 다음 이 핸들을 다시 사용하여 사용자가 선택한 테이블의 열을 검색합니다.

SQLHSTMT    hstmt1;  
SQLCHAR *   Table;  
  
// Create a result set of all tables in the Sales database.  
SQLTables(hstmt1, "Sales", SQL_NTS, "sysadmin", SQL_NTS, NULL, 0, NULL, 0);  
  
// Fetch and display the table names; then close the cursor.  
// Code not shown.  
  
// Have the user select a particular table.  
SelectTable(Table);  
  
// Reuse hstmt1 to create a result set of all columns in Table.  
SQLColumns(hstmt1, "Sales", SQL_NTS, "sysadmin", SQL_NTS, Table, SQL_NTS, NULL, 0);  
  
// Fetch and display the column names in Table; then close the cursor.  
// Code not shown.  

다음 코드에서는 단일 핸들을 사용하여 동일한 문을 반복적으로 실행하여 테이블에서 행을 삭제하는 방법을 보여 줍니다.

SQLHSTMT      hstmt1;  
SQLUINTEGER   OrderID;  
SQLINTEGER    OrderIDInd = 0;  
  
// Prepare a statement to delete orders from the Orders table.  
SQLPrepare(hstmt1, "DELETE FROM Orders WHERE OrderID = ?", SQL_NTS);  
  
// Bind OrderID to the parameter for the OrderID column.  
SQLBindParameter(hstmt1, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,  
                  &OrderID, 0, &OrderIDInd);  
  
// Repeatedly execute hstmt1 with different values of OrderID.  
while ((OrderID = GetOrderID()) != 0) {  
   SQLExecute(hstmt1);  
}  

많은 드라이버에서 문을 할당하는 것은 비용이 많이 드는 작업이므로 이러한 방식으로 동일한 문을 다시 사용하는 것이 일반적으로 기존 문을 해제하고 새 문을 할당하는 것보다 더 효율적입니다. 문에 결과 집합을 만드는 애플리케이션은 문을 다시 테스트하기 전에 결과 집합에 대한 커서를 닫도록 주의해야 합니다. 자세한 내용은 커서 닫기를 참조 하세요.

문을 다시 사용하면 애플리케이션이 한 번에 활성화할 수 있는 문 수의 일부 드라이버에서 제한을 방지할 수 있습니다. "활성"의 정확한 정의는 드라이버별로 지정되지만, 준비되거나 실행되었으며 여전히 결과를 사용할 수 있는 모든 문을 참조하는 경우가 많습니다. 예를 들어 INSERT 문이 준비되면 일반적으로 활성으로 간주됩니다. SELECT 문이 실행되고 커서가 열려 있으면 일반적으로 활성으로 간주됩니다. CREATE TABLE 문이 실행된 후에는 일반적으로 활성으로 간주되지 않습니다.

애플리케이션은 SQL_MAX_CONCURRENT_ACTIVITIES 옵션으로 SQLGetInfo를 호출하여 한 번에 하나의 연결에서 활성화할 수 있는 문의 수를 결정합니다. 애플리케이션은 데이터 원본에 대한 여러 연결을 열어 이 제한보다 더 많은 활성 문을 사용할 수 있습니다. 연결 비용이 많이 들 수 있으므로 성능에 미치는 영향을 고려해야 합니다.

애플리케이션은 문이 SQL_ATTR_QUERY_TIMEOUT 문 특성으로 실행되는 데 할당된 시간을 제한할 수 있습니다. 데이터 원본이 결과 집합을 반환하기 전에 시간 제한 기간이 만료되면 SQL 문을 실행하는 함수는 SQLSTATE HYT00(제한 시간이 만료됨)을 반환합니다. 기본적으로 시간 제한은 없습니다.

이 섹션에서는 다음 항목을 다룹니다.