DB2 通用数据库 iSeries 版 SQL 调用层接口(ODBC)
SQLPrepare — 准备语句
用途
SQLPrepare()
如果已将语句句柄与 SELECT 语句配合使用,则在调用 SQLPrepare() 之前,必须调用 SQLFreeStmt()
语法
SQLRETURN SQLPrepare (SQLHSTMT hstmt,
SQLCHAR *szSqlStr,
SQLINTEGER cbSqlStr);
函数自变量
表 129. SQLPrepare 自变量
数据类型 | 自变量 | 使用 | 描述 |
SQLHSTMT | hstmt | 输入 | 语句句柄。一定不能有打开的游标与 hstmt 相关联。 |
SQLCHAR * | szSqlStr | 输入 | SQL 语句字符串 |
SQLINTEGER | cbSqlStr | 输入 | szSqlStr 自变量的内容的长度。 必须将此长度设置为 szSqlstr 中的 SQL 语句的精确长度,或者,如果语句文本以空终止,则设置为 SQL_NTS。 |
用法
在使用 SQLPrepare()
- SQLNumResultCols()
- SQLDescribeCol()
- SQLColAttributes()
可通过调用 SQLExecute() 来将准备好的语句执行一次或多次。在将该语句句柄与另一个SQLPrepare()、SQLExecDirect()、SQLColumns()、SQLSpecialColumns()、SQLStatistics() 或 SQLTables()
SQL 语句字符串可包含参数标记。参数标记由“?”字符表示,它用来指示语句中的一个位置,在调用 SQLExecute() 时,将在该位置替代应用程序变量的值。SQLBindParam()
SQL 语句不能是 COMMIT 或 ROLLBACK。必须通过调用 SQLTransact()
如果 SQL 语句是定位型 DELETE 或定位型 UPDATE,则必须在同一个连接句柄下的单独语句句柄上定义该语句所引用的游标。
返回码
- SQL_SUCCESS
- SQL_SUCCESS_WITH_INFO
- SQL_ERROR
- SQL_INVALID_HANDLE
诊断
表 130. SQLPrepare SQLSTATE
SQLSTATE | 描述 | 说明 |
24000 | 游标状态无效 | 在指定的 hstmt 上存在打开的游标。 |
37xxx | 语法错误或访问违例 | szSqlStr 包含下列其中一项或多项:
|
HY001 | 内存分配失败 | 驱动程序无法分配支持此函数的执行或完成所必需的内存。 |
HY009 | 自变量值无效 | szSqlStr 是空指针。
自变量 cbSqlStr 小于 1,但不等于 SQL_NTS。 |
HY013 * | 内存管理问题 | 驱动程序无法访问支持此函数的执行或完成所必需的内存。 |
注意:
SQLExecute()
示例
有关以下示例中使用的 check_error、initialize 和 terminate 函数的列表,请参考示例:交互式 SQL 和等价的 DB2 UDB CLI 函数调用。
/*************************************************************************
** file = prepare.c
**
** Example of preparing then repeatedly executing an SQL statement.
**
** Functions used:
**
** SQLAllocConnect SQLFreeConnect
** SQLAllocEnv SQLFreeEnv
** SQLAllocStmt SQLFreeStmt
** SQLConnect SQLDisconnect
**
** SQLBindCol SQLFetch
** SQLTransact SQLError
** SQLPrepare SQLSetParam
** SQLExecute
**************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sqlcli.h"
#define MAX_STMT_LEN 255
int initialize(SQLHENV *henv,
SQLHDBC *hdbc);
int terminate(SQLHENV henv,
SQLHDBC hdbc);
int print_error (SQLHENV henv,
SQLHDBC hdbc,
SQLHSTMT hstmt);
int check_error (SQLHENV henv,
SQLHDBC hdbc,
SQLHSTMT hstmt,
SQLRETURN rc);
/*******************************************************************
** main
** - initialize
** - terminate
*******************************************************************/
int main()
{
SQLHENV henv;
SQLHDBC hdbc;
SQLCHAR sqlstmt[MAX_STMT_LEN + 1]="";
SQLRETURN rc;
rc = initialize(&henv, &hdbc);
if (rc == SQL_ERROR) return(terminate(henv, hdbc));
{SQLHSTMT hstmt;
SQLCHAR sqlstmt[]="SELECT deptname, location from org where division = ?";
SQLCHAR deptname[15],
location[14],
division[11];
SQLINTEGER rlength,
plength;
rc = SQLAllocStmt(hdbc, &hstmt);
if (rc != SQL_SUCCESS )
check_error (henv, hdbc, SQL_NULL_HSTMT, rc);
/* prepare statement for multiple use */
rc = SQLPrepare(hstmt, sqlstmt, SQL_NTS);
if (rc != SQL_SUCCESS )
check_error (henv, hdbc, hstmt, rc);
/* bind division to parameter marker in sqlstmt */
rc = SQLSetParam(hstmt, 1, SQL_CHAR, SQL_CHAR, 10, 10, division,
&plength);
if (rc != SQL_SUCCESS )
check_error (henv, hdbc, hstmt, rc);
/* bind deptname to first column in the result set */
rc = SQLBindCol(hstmt, 1, SQL_CHAR, (SQLPOINTER) deptname, 15,
&rlength);
if (rc != SQL_SUCCESS )
check_error (henv, hdbc, hstmt, rc);
rc = SQLBindCol(hstmt, 2, SQL_CHAR, (SQLPOINTER) location, 14,
&rlength);
if (rc != SQL_SUCCESS )
check_error (henv, hdbc, hstmt, rc);
printf("\nEnter Division Name or 'q' to quit:\n");
printf("(Eastern, Western, Midwest, Corporate)\n");
gets(division);
plength = SQL_NTS;
while(division[0] != 'q')
{
rc = SQLExecute(hstmt);
if (rc != SQL_SUCCESS )
check_error (henv, hdbc, hstmt, rc);
printf("Departments in %s Division:\n", division);
printf("DEPTNAME Location\n");
printf("-------------- -------------\n");
while ((rc = SQLFetch(hstmt)) == SQL_SUCCESS)
{
printf("%-14.14s %-13.13s \n", deptname, location);
}
if (rc != SQL_NO_DATA_FOUND )
check_error (henv, hdbc, hstmt, rc);
SQLFreeStmt(hstmt, SQL_CLOSE);
printf("\nEnter Division Name or 'q' to quit:\n");
printf("(Eastern, Western, Midwest, Corporate)\n");
gets(division);
}
}
rc = SQLTransact(henv, hdbc, SQL_ROLLBACK);
if (rc != SQL_SUCCESS )
check_error (henv, hdbc, SQL_NULL_HSTMT, rc);
terminate(henv, hdbc);
return (0);
}/* end main */
参考
- SQLColAttributes — 列属性
- SQLDescribeCol — 描述列属性
- SQLExecDirect — 直接执行语句
- SQLExecute — 执行语句
- SQLNumResultCols — 获取结果列数