设为首页 收藏本站
查看: 947|回复: 0

[经验分享] DB2 通用数据库 iSeries 版 SQL 调用层接口(ODBC)

[复制链接]

尚未签到

发表于 2016-11-17 08:13:03 | 显示全部楼层 |阅读模式
  


DB2 通用数据库 iSeries 版 SQL 调用层接口(ODBC)

SQLPrepare — 准备语句
  用途
  SQLPrepare() 使 SQL 语句与输入语句句柄相关联并将该语句发送至 DBMS 以进行准备。应用程序可以通过将该语句句柄传送给其它函数来引用这个准备好的语句。
  如果已将语句句柄与 SELECT 语句配合使用,则在调用 SQLPrepare() 之前,必须调用 SQLFreeStmt() 来关闭游标。
  语法

[size=90%]SQLRETURN SQLPrepare (SQLHSTMT       hstmt,
SQLCHAR        *szSqlStr,
SQLINTEGER     cbSqlStr);

  函数自变量 
  表 129. SQLPrepare 自变量


[size=90%]数据类型[size=90%]自变量[size=90%]使用[size=90%]描述


[size=90%]SQLHSTMT
[size=90%]hstmt
[size=90%]输入
[size=90%]语句句柄。一定不能有打开的游标与 hstmt 相关联。


[size=90%]SQLCHAR *
[size=90%]szSqlStr
[size=90%]输入
[size=90%]SQL 语句字符串


[size=90%]SQLINTEGER
[size=90%]cbSqlStr
[size=90%]输入
[size=90%]szSqlStr 自变量的内容的长度。  必须将此长度设置为 szSqlstr 中的 SQL 语句的精确长度,或者,如果语句文本以空终止,则设置为 SQL_NTS。


  用法
  在使用 SQLPrepare() 准备语句之后,应用程序可通过调用下列函数来请求关于结果集的格式的信息(如果该语句是 SELECT 语句的话):


  • SQLNumResultCols()
  • SQLDescribeCol()
  • SQLColAttributes()
  可通过调用 SQLExecute() 来将准备好的语句执行一次或多次。在将该语句句柄与另一个SQLPrepare()、SQLExecDirect()、SQLColumns()、SQLSpecialColumns()、SQLStatistics() 或 SQLTables() 配合使用之前,该 SQL 语句将保持与该句柄相关联。
  SQL 语句字符串可包含参数标记。参数标记由“?”字符表示,它用来指示语句中的一个位置,在调用 SQLExecute() 时,将在该位置替代应用程序变量的值。SQLBindParam() 用来将应用程序变量绑定到每个参数标记(使应用程序变量与参数标记相关联),以及指示在传送数据时是否应该执行任何数据转换。
  SQL 语句不能是 COMMIT 或 ROLLBACK。必须通过调用 SQLTransact() 来发出 COMMIT 或 ROLLBACK。
  如果 SQL 语句是定位型 DELETE 或定位型 UPDATE,则必须在同一个连接句柄下的单独语句句柄上定义该语句所引用的游标。
  返回码


  • SQL_SUCCESS
  • SQL_SUCCESS_WITH_INFO
  • SQL_ERROR
  • SQL_INVALID_HANDLE
  诊断 
  表 130. SQLPrepare SQLSTATE


[size=90%]SQLSTATE[size=90%]描述[size=90%]说明


[size=90%]24000
[size=90%]游标状态无效
[size=90%]在指定的 hstmt 上存在打开的游标。


[size=90%]37xxx
[size=90%]语法错误或访问违例
[size=90%]szSqlStr 包含下列其中一项或多项:

  • COMMIT
  • ROLLBACK
  • 所连接的数据库服务器未能准备的 SQL 语句
  • 包含语法错误的语句




[size=90%]HY001
[size=90%]内存分配失败
[size=90%]驱动程序无法分配支持此函数的执行或完成所必需的内存。


[size=90%]HY009
[size=90%]自变量值无效
[size=90%]szSqlStr 是空指针。  自变量 cbSqlStr 小于 1,但不等于 SQL_NTS。




[size=90%]HY013 *
[size=90%]内存管理问题
[size=90%]驱动程序无法访问支持此函数的执行或完成所必需的内存。

注意:并非所有 DBMS 在进行准备时都报告上述所有诊断消息。因此,应用程序在调用 SQLExecute() 时还必须能够处理这些情况。  示例
  有关以下示例中使用的 check_error、initialize 和 terminate 函数的列表,请参考示例:交互式 SQL 和等价的 DB2 UDB CLI 函数调用。

[size=90%]/*************************************************************************
** 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 — 获取结果列数


[ 页的顶部 | 上一页 | 下一页 | 目录 | 索引 ]

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-301388-1-1.html 上篇帖子: DB2第三章 使用SQL-表, 临时表,约束,视图,索引,数据类型 下篇帖子: 执行批处理时,DB2 报数据库的事务日志已满的错误,解决办法.(二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表