데이터베이스 엔진에 의해 컴파일(준비)된 시기와 문을 정의하는 사람에 따라 문을 실행하는 네 가지 방법이 있습니다.
직접 실행 애플리케이션은 SQL 문을 정의합니다. 한 단계로 런타임에 준비 및 실행됩니다.
준비된 실행 애플리케이션은 SQL 문을 정의합니다. 이 파일은 별도의 단계로 런타임에 준비 및 실행됩니다. 문장을 한 번 준비하고 여러 번 실행할 수 있습니다.
절차 애플리케이션은 개발 시 하나 이상의 SQL 문을 정의 및 컴파일하고 이러한 문을 프로시저로 데이터 원본에 저장할 수 있습니다. 프로시저는 런타임에 하나 이상 실행됩니다. 애플리케이션은 카탈로그 함수를 사용하여 사용 가능한 저장 프로시저를 열거할 수 있습니다.
카탈로그 함수 드라이버 작성기는 미리 정의된 결과 집합을 반환하는 함수를 만듭니다. 일반적으로 이 함수는 미리 정의된 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(제한 시간이 만료됨)을 반환합니다. 기본적으로 시간 제한은 없습니다.
이 섹션에서는 다음 항목을 다룹니다.