执行语句

可通过四种方法执行语句,具体取决于数据库引擎编译(准备)这些语句的时间,以及定义它们的人员:

  • 直接执行应用程序定义 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(超时过期)。 默认情况下没有任何超时。

本部分包含以下主题。