執行陳述式
有四種執行陳述式的方法,具體取決於資料庫引擎何時編譯 (準備) 它們以及定義它們的人員:
直接執行 應用程式會定義 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 語句之後,通常不會將其視為作用中。
應用程式會使用 SQL_MAX_CONCURRENT_ACTIVITIES 選項來呼叫 SQLGetInfo,以判斷一次在單一連線上可以為作用中的陳述式數。 透過開啟資料來源的多個連線,應用程式可以使用比此限制更多的作用中陳述式; 然而,因為連線可能很昂貴,所以應該考慮對效能的影響。
應用程式可以限制使用 SQL_ATTR_QUERY_TIMEOUT 陳述式屬性執行陳述式所分配的時間量。 如果資料來源傳回結果集之前逾時期間到期,則執行 SQL 陳述式的函式會傳回 SQLSTATE HYT00 (逾時過期)。 預設是沒有逾時。
此章節包含下列主題。