SQLExecute 函数 (CLI)-执行语句
规范:
- CLI 1.1
- ODBC 1.0
- ISO CLI
语法
SQLRETURN SQLExecute (SQLHSTMT StatementHandle); /* hstmt */ 函数参数
| 数据类型 | 自变量 | 使用 | 描述 |
|---|---|---|---|
| SQLHSTMT | StatementHandle | 输入 | 语句句柄。 不能存在与 StatementHandle相关联的打开游标。 |
用法
先前在 StatementHandle 上使用 SQLPrepare () 准备的 SQL 语句字符串可能包含参数标记。 在调用 SQLExecute()之前,必须绑定所有参数。
一旦应用程序处理了 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。
| 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,
¶meter1,
0,
NULL);
/* ... */
parameter1 = 15;
/* execute the statement for parameter1 = 15 */
cliRC = SQLExecute(hstmt);