有四种方法可以执行语句,具体取决于数据库引擎编译(准备)的时间,以及谁定义了它们。
直接执行 应用程序定义 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);
}
对于许多驱动程序,分配语句是一项昂贵的任务,因此,以这种方式重用同一语句通常比释放现有语句和分配新语句更有效。 在语句上创建结果集的应用程序必须小心,在重新执行语句之前关闭结果集上的游标;有关详细信息,请参阅 关闭光标。
通过重用语句,应用程序还能强制避免某些驱动程序中对同时处于活动状态的语句数量的限制。 “active”的确切定义特定于驱动程序,但它通常指任何已准备好或已执行且仍具有可用结果的语句。 例如,在准备好 INSERT 语句后,它通常被视为处于活动状态;执行 SELECT 语句并且游标仍处于打开状态后,通常将其视为活动;执行 CREATE TABLE 语句后,通常不会将其视为活动状态。
应用程序使用 SQL_MAX_CONCURRENT_ACTIVITIES 选项调用 SQLGetInfo ,确定一次在单个连接上可以处于活动状态的语句数。 应用程序可以通过打开与数据源的多个连接来使用比此限制更多的活动语句;但是,由于连接可能很昂贵,因此应考虑对性能的影响。
应用程序可以限制使用 SQL_ATTR_QUERY_TIMEOUT 语句属性执行的语句分配的时间量。 如果超时期限在数据源返回结果集之前过期,则执行 SQL 语句的函数将返回 SQLSTATE HYT00 (超时过期)。 默认情况下,没有超时。
本节包含以下主题。