執行語句

執行一個語句有四種方式,取決於資料庫引擎何時編譯(準備)它們以及定義者:

  • 直接執行 應用程式定義 SQL 陳述句。 它在執行時只需一步即可準備與執行。

  • 預處理 應用程式定義 SQL 語句。 它會在執行時分階段準備與執行。 語句可以準備一次,並多次執行。

  • 程序 應用程式可在開發時定義並編譯一個或多個 SQL 語句,並將這些語句以程序形式儲存在資料來源中。 此程序在執行時執行一次或多次。 應用程式可利用目錄函式列舉可用的儲存程序。

  • 目錄功能 驅動程式寫入者會建立一個函式,回傳預先定義的結果集。 通常,這個函式會提交預先定義的 SQL 陳述式,或呼叫為此目的所建立的程序。 該函式在執行時執行一次或多次。

特定語句(以其語句柄識別)可以執行任意次數。 該語句可以用多種不同的 SQL 語句執行,或是用相同的 SQL 語句重複執行。 例如,以下程式碼使用相同的語句句柄(hstmt1)來檢索並顯示銷售資料庫中的表格。 接著它會重用這個處理程序,從使用者選擇的資料表中取得欄位。

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(表示逾時已過期)。 預設情況下,沒有超時。

此章節包含下列主題。