SQLExecute 函数 (CLI)-执行语句

在同一语句句柄上执行一次或多次使用 SQLPrepare() 成功准备的语句。 使用 SQLBindParameter()SQLBindFileToParam()绑定到参数标记的任何应用程序变量的当前值来执行该语句。

规范:

  • CLI 1.1
  • ODBC 1.0
  • ISO CLI

语法

SQLRETURN   SQLExecute (SQLHSTMT       StatementHandle);  /* hstmt */

函数参数

表 1. SQLExecute 参数
数据类型 自变量 使用 描述
SQLHSTMT StatementHandle 输入 语句句柄。 不能存在与 StatementHandle相关联的打开游标。

用法

先前在 StatementHandle 上使用 SQLPrepare () 准备的 SQL 语句字符串可能包含参数标记。 在调用 SQLExecute()之前,必须绑定所有参数。

注: 对于 XQuery 表达式,不能在表达式本身中指定参数标记。 但是,可以使用 XMLQUERY 函数将参数标记与 XQuery 变量绑定。 然后,绑定参数标记的值将传递到 XMLQUERY 中指定的 XQuery 表达式以执行。

一旦应用程序处理了 SQLExecute() 调用的结果,它就可以使用新的 (或相同的) 参数值再次执行该语句。

无法通过调用 SQLExecute()来重新执行由 SQLExecDirect() 执行的语句。 只有使用 SQLPrepare() 准备的语句才能使用 SQLExecute()执行和重新执行。

如果预编译 SQL 语句是查询 或 XQuery 表达式,那么 SQLExecute() 将生成游标名称,并打开游标。 如果应用程序已使用 SQLSetCursorName() 将游标名与语句句柄相关联,那么 CLI 会将应用程序生成的游标名与内部生成的游标名相关联。

若要在给定的语句句柄上多次执行查询 ,应用程序必须通过调用 SQLCloseCursor( 或 SQLFreeStmt() 并使用SQL_CLOSE选项来关闭游标。 调用 SQLExecute()时,语句句柄上不得有打开的游标。

如果生成了结果集,那么 SQLFetch()SQLFetchScroll() 将在绑定变量, LOB 定位器或 LOB 文件引用中检索下一行 (或多行) 数据。

如果 SQL 语句是定位 DELETE 或定位 UPDATE ,那么在调用 SQLExecute() 时,该语句所引用的游标必须定位在行上,并且必须定义在同一连接句柄下的单独语句句柄上。

如果已使用 SQL_ATTR_PARAMSET_SIZE 属性调用 SQLSetStmtAttr() 以指定输入参数值的数组已绑定到每个参数标记,那么应用程序只需调用 SQLExecute() 一次即可处理整个输入参数值数组。 如果执行的语句返回多个结果集 (每个输入参数集一个结果集) ,那么在当前结果集的处理完成后,应使用 SQLMoreResults() 来前进到下一个结果集。

返回码

  • SQL_SUCCESS
  • SQL_SUCCESS_WITH_INFO
  • SQL_ERROR
  • SQL_INVALID_HANDLE
  • SQL_NEED_DATA
  • SQL_NO_DATA_FOUND

当应用程序请求通过将 SQLBindParameter() 期间指定的 *StrLen_or_IndPtr设置为SQL_DATA_AT_EXEC,为一个或多个参数输入数据时,将返回SQL_NEED_DATA。

如果 SQL 语句是搜索的 UPDATE 或搜索的 DELETE ,并且没有任何行满足搜索条件,那么将返回 SQL_NO_DATA_FOUND。

Diagnostics

SQLExecute() 的 SQLSTAT 包括除 HY009 , HY090 以外的 SQLExecDirect() 的所有 SQL STAT ,并在下表中添加了 SQLSTATE。 由于延迟准备行为,在调用 SQLExecute() 时也可以返回 SQLPrepare() 可能返回的任何 SQLSTATE。

表 2. SQLExecute SQLSTAT
SQLSTATE 描述 说明
HY010 函数顺序错误。 指定的 StatementHandle 未处于预编译状态。 在未首先调用 SQLPrepare()的情况下调用了 SQLExecute()

授权

无。

示例

  SQLHANDLE hstmt; /* statement handle */
  SQLCHAR *stmt = (SQLCHAR *)"DELETE FROM org WHERE deptnumb = ? ";
  SQLSMALLINT parameter1 = 0;

  /* allocate a statement handle */
  cliRC = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

  /* ... */

  /* prepare the statement */
  cliRC = SQLPrepare(hstmt, stmt, SQL_NTS);
  
  /* ... */

  /* bind parameter1 to the statement */
  cliRC = SQLBindParameter(hstmt,
                           1,
                           SQL_PARAM_INPUT,
                           SQL_C_SHORT,
                           SQL_SMALLINT,
                           0,
                           0,
                           &parameter1,
                           0,
                           NULL);
  /* ... */
  parameter1 = 15;

  /* execute the statement for parameter1 = 15  */
  cliRC = SQLExecute(hstmt);