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


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

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

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

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