Udostępnij przez


Wykonywanie instrukcji

Istnieją cztery sposoby wykonywania instrukcji, w zależności od tego, kiedy są one kompilowane (przygotowane) przez aparat bazy danych i kto je definiuje:

  • Bezpośrednie wykonywanie Aplikacja definiuje instrukcję SQL. Jest przygotowywany i uruchamiany w czasie wykonania w jednym kroku.

  • Przygotowane wykonanie Aplikacja definiuje instrukcję SQL. Przygotowywany i wykonywany podczas działania w osobnych krokach. Instrukcję można przygotować raz i wykonać wiele razy.

  • Procedury Aplikacja może definiować i kompilować co najmniej jedną instrukcję SQL w czasie programowania i przechowywać te instrukcje w źródle danych jako procedurę. Procedura jest wykonywana jednokrotnie lub wielokrotnie podczas działania. Aplikacja może wyliczać dostępne procedury składowane przy użyciu funkcji wykazu.

  • Funkcje wykazu Autor sterownika tworzy funkcję zwracającą zdefiniowany zestaw wyników. Zazwyczaj ta funkcja przesyła wstępnie zdefiniowaną instrukcję SQL lub wywołuje procedurę utworzoną w tym celu. Funkcja jest wykonywana jeden lub więcej razy podczas działania.

Określoną instrukcję (zidentyfikowaną przez uchwyt instrukcji) można wykonać dowolną liczbę razy. Instrukcję można wykonać za pomocą różnych instrukcji SQL lub można wykonać wielokrotnie przy użyciu tej samej instrukcji SQL. Na przykład poniższy kod używa tego samego uchwytu instrukcji (hstmt1), aby pobrać i wyświetlić tabele w bazie danych Sales. Następnie ponownie użyje tego uchwytu, aby pobrać kolumny w tabeli wybranej przez użytkownika.

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.  

Poniższy kod pokazuje, jak pojedynczy uchwyt jest używany do wielokrotnego wykonywania tej samej instrukcji w celu usunięcia wierszy z tabeli.

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

W przypadku wielu sterowników przydzielanie instrukcji jest kosztownym zadaniem, więc ponowne wykorzystanie tej samej instrukcji w ten sposób jest zwykle bardziej wydajne niż zwalnianie istniejących instrukcji i przydzielanie nowych. Aplikacje tworzące zestawy wyników w instrukcji muszą być ostrożne, aby zamknąć kursor nad zestawem wyników przed ponownym wykonaniem instrukcji; Aby uzyskać więcej informacji, zobacz Zamykanie kursora.

Ponowne używanie instrukcji również wymusza na aplikacji unikanie ograniczeń dotyczących liczby instrukcji, które mogą być aktywne jednocześnie w niektórych sterownikach. Dokładna definicja "aktywny" jest specyficzna dla sterownika, ale często odnosi się do każdej instrukcji, która została przygotowana lub wykonana i nadal ma dostępne wyniki. Na przykład po przygotowaniu instrukcji INSERT jest ona ogólnie uważana za aktywną; po wykonaniu instrukcji SELECT , a kursor jest nadal otwarty, jest ogólnie uważany za aktywny; po wykonaniu instrukcji CREATE TABLE nie jest ona ogólnie uważana za aktywną.

Aplikacja określa, ile instrukcji może być aktywnych w jednym połączeniu jednocześnie, wywołując polecenie SQLGetInfo z opcją SQL_MAX_CONCURRENT_ACTIVITIES. Aplikacja może używać bardziej aktywnych instrukcji niż ten limit, otwierając wiele połączeń ze źródłem danych; ponieważ połączenia mogą być kosztowne, należy jednak wziąć pod uwagę wpływ na wydajność.

Aplikacje mogą ograniczyć ilość czasu przydzielonego dla instrukcji do wykonania za pomocą atrybutu instrukcji SQL_ATTR_QUERY_TIMEOUT. Jeśli okres przekroczenia limitu czasu wygasa przed zwróceniem zestawu wyników przez źródło danych, funkcja wykonująca instrukcję SQL zwraca wartość SQLSTATE HYT00 (upłynął limit czasu). Domyślnie nie ma limitu czasu.

Ta sekcja zawiera następujące tematy.