Ausführen einer Anweisung

Es gibt vier Möglichkeiten zum Ausführen einer Anweisung, je nachdem, wann sie vom Datenbankmodul kompiliert (vorbereitet) werden und wer sie definiert:

  • Direct Execution Die Anwendung definiert die SQL-Anweisung. Sie wird zur Laufzeit in einem einzigen Schritt vorbereitet und ausgeführt.

  • Vorbereitete Ausführung Die Anwendung definiert die SQL-Anweisung. Sie wird zur Laufzeit in separaten Schritten vorbereitet und ausgeführt. Die Anweisung kann einmal vorbereitet und mehrmals ausgeführt werden.

  • Prozeduren Die Anwendung kann eine oder mehrere SQL-Anweisungen zur Entwicklungszeit definieren und kompilieren und diese Anweisungen als Prozedur in der Datenquelle speichern. Die Prozedur wird einmal zur Laufzeit ausgeführt. Die Anwendung kann verfügbare gespeicherte Prozeduren mithilfe von Katalogfunktionen aufzählen.

  • Katalogfunktionen Der Treiberschreiber erstellt eine Funktion, die ein vordefiniertes Resultset zurückgibt. In der Regel sendet diese Funktion eine vordefinierte SQL-Anweisung oder ruft eine Prozedur auf, die zu diesem Zweck erstellt wurde. Die Funktion wird mindestens einmal zur Laufzeit ausgeführt.

Eine bestimmte Anweisung (wie durch das zugehörigen Anweisungshandle identifiziert) kann beliebig oft ausgeführt werden. Die Anweisung kann mit einer Vielzahl verschiedener SQL-Anweisungen ausgeführt werden, oder sie kann wiederholt mit derselben SQL-Anweisung ausgeführt werden. Der folgende Code verwendet beispielsweise das gleiche Anweisungshandle (hstmt1), um die Tabellen in der Vertriebsdatenbank abzurufen und anzuzeigen. Anschließend wird dieses Handle wiederverwendet, um die Spalten in einer vom Benutzer ausgewählten Tabelle abzurufen.

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.  

Der folgende Code zeigt, wie ein einzelnes Handle verwendet wird, um wiederholt dieselbe Anweisung auszuführen, um Zeilen aus einer Tabelle zu löschen.

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);  
}  

Für viele Faktoren ist das Zuweisen von Anweisungen eine teure Aufgabe, sodass die Wiederverwendung derselben Anweisung auf diese Weise in der Regel effizienter ist als das Freigeben vorhandener Anweisungen und das Zuweisen neuer Anweisungen. Anwendungen, die Resultsets für eine Anweisung erstellen, müssen vorsichtig sein, um den Cursor über dem Resultset zu schließen, bevor die Anweisung erneut ausgeführt wird. weitere Informationen finden Sie unter Schließen des Cursors.

Durch erneutes Verwenden von Anweisungen wird die Anwendung auch gezwungen, eine Einschränkung in einigen Faktoren der Anzahl von Anweisungen zu vermeiden, die gleichzeitig aktiv sein können. Die genaue Definition von "aktiv" ist treiberspezifisch, bezieht sich aber häufig auf jede Anweisung, die vorbereitet oder ausgeführt wurde und weiterhin Ergebnisse verfügbar ist. Nachdem beispielsweise eine INSERT-Anweisung vorbereitet wurde, wird sie in der Regel als aktiv betrachtet. Nachdem eine SELECT-Anweisung ausgeführt wurde und der Cursor noch geöffnet ist, wird sie in der Regel als aktiv betrachtet. Nachdem eine CREATE TABLE-Anweisung ausgeführt wurde, wird sie in der Regel nicht als aktiv angesehen.

Eine Anwendung bestimmt, wie viele Anweisungen gleichzeitig für eine einzelne Verbindung aktiv sein können, indem SIE SQLGetInfo mit der Option SQL_MAX_CONCURRENT_ACTIVITIES aufrufen. Eine Anwendung kann aktivere Anweisungen als diese Grenze verwenden, indem mehrere Verbindungen zur Datenquelle geöffnet werden. da Verbindungen jedoch teuer sein können, sollte die Auswirkung auf die Leistung berücksichtigt werden.

Anwendungen können die Für die Ausführung einer Anweisung zugewiesene Zeit mit dem attribut SQL_ATTR_QUERY_TIMEOUT-Anweisung einschränken. Wenn der Timeoutzeitraum abläuft, bevor die Datenquelle das Resultset zurückgibt, gibt die Funktion, die die SQL-Anweisung ausführt, SQLSTATE HYT00 zurück (Timeout abgelaufen). Standardmäßig ist kein Timeout festgelegt.

In diesem Abschnitt werden die folgenden Themen behandelt: