Поделиться через


Выполнение инструкции

Существует четыре способа выполнения инструкции в зависимости от того, когда они компилируются (подготавливаются) движком базы данных и тем, кто их определяет.

  • Прямое выполнение Приложение определяет инструкцию 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 она обычно не считается активной.

Приложение определяет, сколько инструкций может быть активным в одном подключении одновременно путем вызова SQLGetInfo с параметром SQL_MAX_CONCURRENT_ACTIVITIES. Приложение может использовать больше активных выражений, чем это ограничение, открыв несколько подключений к источнику данных. Поскольку подключения могут быть дорогостоящими, следует учитывать влияние на производительность.

Приложения могут ограничить время выполнения инструкции с помощью атрибута оператора SQL_ATTR_QUERY_TIMEOUT. Если истекает период времени ожидания, прежде чем источник данных возвращает результирующий набор, функция, выполняющая инструкцию SQL, возвращает SQLSTATE HYT00 (истекло время ожидания). По умолчанию время ожидания отсутствует.

Этот раздел содержит следующие подразделы.