??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
db2 prep Dbprog.sqc bindfile gave me the following error.
172 SQL0008N The token "int" found in a host variable
declaration is not valid.
Is seems that the precompiler do not accept the int declarations, it accept only short or long. Is there a way to tell the precompiler to accept int variable like this
EXEC SQL BEGIN DECLARE SECTION;
int maj = 0;
int min = 0;
char pch = 0;
EXEC SQL END DECLARE SECTION;
Thanks
Ҏlong实可以了?br>
]]>
保持游标打开的方法是在定义游标时加上with hold选项
但是Q我declare 游标时用了with hold选项--只对commit有效?br>
E序D:
declare test_cur cursor with hold for
select .... from A where ... order by ... with ur;
open test_cur;
while( 1 ){
fecth test_cur into ......;
判断SQLCODE
begin_work(); /* 其实是讄了一个标?*/
SQL 操作Q修改其他表或者游标所在表的数据?br> Ҏl果判断 commit or rollback?nbsp; /* 此处如果rollback 游标被关?*/
}
异常状态:
如果游标中进行了SQL操作Q根据结果判断ƈrollbackӞ
下一ơfetchӞ会提C?501 没有打开游标。从而报错退出?br>
q种Ҏ是否可行
declare test_cur cursor with hold for
select .... from A where ... order by ... with ur;
open test_cur;
while( 1 ){
fecth test_cur into ......;
判断SQLCODE
pid = fork();
if( pid == 0 ) { /* 子进E干z?*/
sqledtin( &sqlca );
setsid();
signal( SIGHUP, SIG_IGN );
db_disconn( G_mdb_name );
begin_work(); /* 其实是讄了一个标?*/
SQL 操作Q修改其他表或者游标所在表的数据?br> Ҏl果判断 commit or rollback?nbsp;
db_disconn();
exit();
}
/* 主进E等待子q程l束 */
}
close test_cur;
rollback to savepoint a;
]]>
关系型数据库产生后很快就成ؓ数据库系l的L产品Q由于每个DBMS厂商都有自己的一套标准,Z很早׃生了标准化的xQ于是生了SQLQ由于其语法规范逐渐Zh所接受Q成为RDBMS上的d语言。最初,各数据库厂商Z解决[本文q?a >www.gwdq.com公文大全www.gwdq.cn攉整理]互连的问题,往往提供嵌入式SQL APIQ用户在客户机端要操作系l中的RDBMSӞ往往要在E序中嵌入SQL语句q行预编译。由于不同厂商在数据格式、数据操作、具体实现甚臌法方面都h不同E度的差异,所以彼此不能兼宏V?br>长期以来Q这UAPI的非规范情况令用户和RDBMS厂商都不能满意。在80q代后期Q一些著名的厂商包括Oracle、Sybase、Lotus、Ingres、Informix、HP、DEC{结成了SQL Access GroupQ简USAGQ,提出了SQL API的规范核心:调用U接口(Call Level InterfaceQ,UCLI?br>1991q?1月,微Y宣布了ODBCQ次q推出可用版本?992q?月,推出了ODBC SDK 2.0版。ODBCZSAG的SQL CAE草案所规定的语法,共分为Core、Level 1?Level 2三种定义Q分别规范了22?6?3?1条命令,其中29条命令甚臌了SAG CLI中原有的定义Q功能强大而灵zR它q包括标准的错误代码集、标准的q接和登录DBMSҎ、标准的数据cd表示{?br>׃ODBC思想上的先进性,且没有同cȝ标准或品与之竞争,它一枝独UQ推出后仅仅两三q就受到了众多厂家与用户的青睐,成ؓ一U广为接受的标准。目前,已经?30多家独立厂商宣布了对ODBC的支持,常见的DBMS都提供了ODBC的驱动接口,q些厂商包括Oracle、Sybase、Informix、Ingres、IBM(DB/2)、DEC(RDB)、HP(ALLBASE/SQL)、Gupta、Borland(Paradox){。目前,ODBC已经成ؓ客户?服务器系l中的一个重要支持技术?br>二、ODBC的基本思想与特?br>ODBC的基本思想是ؓ用户提供单、标准、透明的数据库q接的公qE接口,开发厂商根据ODBC的标准去实现底层的驱动程序,q个驱动对用h透明的,q允许根据不同的DBMS采用不同的技术加以优化实玎ͼq就利于不断吸收新的技术而趋完善?br>q同时也是数据库驱动的思想Q它很类gWindows中打印驱动的思想。在Windows中,用户安装不同的打印驱动程序,使用同样一条打印语句或操作Q就可很Ҏ地实现在不同打印Z打印输出Q而不需要了解内部的具体原理。ODBC出现以后Q用户安装不同的DBMS驱动可用同LSQL语句实现在不同DBMS上进行同L操作Q而且无需预编译。ODBC带来了数据库q接方式的变革,如图1所C。在传统方式中,开发h员要熟悉多个DBMS及其APIQ一旦DBMS端出现变动,则往往D用户端系l重新编建或者源代码的修改,q给开发和l护工作带来了很大困难。在ODBC方式中,不管底层|络环境如何Q也无论采用何种DBMSQ用户在E序中都使用同一套标准代码,无需逐个了解各DBMS及其API的特点,源程序不因底层的变化而重新编建或修改Q从而减M开发维护的工作量,~短了开发周期?br>@@12W03500.GIF;? 数据库连接方式的转变@@
概括hQODBCh以下灉|的特点:
1. 使用L序有很高的互操作性,相同的目标代码适用于不同的DBMSQ?br>2. ׃ODBC的开放性,它ؓE序集成提供了便利,为客h/服务器结构提供了技术支持;
3. ׃应用与底层网l环境和DBMS分开Q简化了开发维护上的困难?br>三、ODBC的体pȝ构和实现
ODBC是依靠分层结构来实现的,如此可保证其标准性和开放性。图2所CZؓODBC的体pȝ构,它共分ؓ四层Q应用程序、驱动程序管理器、驱动程序和数据源。微软公司对ODBC规程q行了规范,它ؓ应用层的开发者和用户提供标准的函数、语法和错误代码{,微Yq提供了驱动E序理器,它在Windows中是一个动态链接库即ODBC.DLL。驱动程序层由微软、DBMS厂商或第三开发商提供Q它必须W合ODBC的规E,对于OracleQ它是O
本文来自: 公文大全(www.gwdq.com) 详细出处参考:http://www.gwdq.com/lwzx/jsj/jsjll/146960.html
RA6WIN.DLLQ对于SQL ServerQ它是SQLSRVR.DLL?/p>
@@12W03501.GIF;? ODBC体系l构@@
下面我们详细介绍各层的功能?br>1. 应用E序?Application)
使用ODBC接口的应用程序可执行以下dQ?br>①请求与数据源的q接和会?SQLConnect)Q?br>②向数据源发送SQLh(SQLExecDirct或SQLExecute)Q?br>③对SQLh的结果定义存储区和数据格式;
④请求结果;
⑤处理错误;
⑥如果需要,把结果返回给用户Q?br>⑦对事务q行控制Q请求执行或回退操作(SQLTransact)Q?br>⑧终止对数据源的q接(SQLDisconnect)?br>2. 驱动E序理?Driver Manager)
由微软提供的驱动E序理器是带有输入库的动态连接库ODBC.DLLQ其主要目的是装入驱动程序,此外q执行以下工?
①处理几个ODBC初始化调用;
②ؓ每一个驱动程序提供ODBC函数入口点;
③ؓODBC调用提供参数和次序验证?br>3. 驱动E序(Driver)
驱动E序是实现ODBC函数和数据源交互的DLLQ当应用E序调用SQL Connect或者SQLDriver Connect函数Ӟ驱动E序理器装入相应的驱动E序Q它Ҏ自应用程序的ODBC函数调用q行应答Q按照其要求执行以下d:
①徏立与数据源的q接Q?br>②向数据源提交请求;
③在应用E序需求时Q{换数据格式;
④返回结果给应用E序Q?br>⑤将q行错误格式化ؓ标准代码q回Q?br>⑥在需要时说明和处理光标?br>以上q些功能都是对应用程序层功能的具体实现。驱动程序的配置方式可以划分Z下两U?br>(1)单层?single-tier) q种方式下,驱动E序要处理ODBC调用SQL语句Qƈ直接操纵数据库,因此h数据存取功能。这U配|最常见的是同一台微Z上异U数据库通过ODBC存取Q如在Powerbuilder中存取XBase、Excel、Paradox{数据文?如图3所C。@@12W03502.GIF;? 一层配|示意图@@
(2)多层?multiple-tier) q种配置中驱动程序仅仅处理ODBC调用Q而将SQL语句交给服务器执行,然后q回l果。这U情况往往是应用程序、驱动程序管理器、驱动程序驻留在客户机端Q而数据源和数据存取功能放在服务器端。譬如用Foxpro或Excel存取SQL Server或Oracle上的数据,如图4所C?br>@@12W03503.GIF;? 二层配置C意图@@
有时在以上两者之间加上网关以解决[本文q?a >www.gwdq.com公文大全www.gwdq.cn攉整理]通信协议的{换等问题Q这旉动程序要请求先传送给|关Q如讉KDEC RDB和IBM AS/400时的配置,如图5所C?br>@@12W03504.GIF;? 三层配置C意图@@
4. 数据?br>数据源由用户惌存取的数据和它相关的操作pȝ、DBMS及网l环境组成?br>四、一致性?br>从应用程序观Ҏ看,最理想的情冉|每个数据源和驱动E序都支持同一套ODBC函数调用和SQL语句。但是由于Ş形色色的DBMS在实C有很大的差异Q它们所依赖的系l和环境也各不相同,在对ODBC支持的程度上׃一致。一致性?Conformance Levels)建立了对众多功能的标准划分,为应用程序和驱动E序提供帮助和选择的依据。它划定了驱动程序所支持的ODBC函数和SQL语句的范_我们可以用SQLGetInfo、SQLGetFunctions、SQLTypeInfo三个函数L驱动E序所支持的功能集。ODBC从API和SQL语法两方面划分别?br>1. API的一致?br>ODBC函数调用划分ؓ三?br>(1)核心API 它包括了与SAG的CLI相匹配的基本功能Q包括:分配与释攄境、连接及语句句柄Q连接到数据源;准备q执行SQL语句或立x行SQL语句QؓSQL语句和结果列中的参数分配存储器;从结果中索数据,索结果的信息Q提交和撤消事务处理Q检索错误信息?br>(2)一UAPI 它包括了核心API的全部功能,比如用特定驱动程序的对话框连接到数据源;讄和查询语句值和q接选项Q送部分或全部参数|索部分和全部l果Q检索目录信息;索关于驱动程序和数据源的信息?br>(3)二API 其功能包括核心和一UAPI的全部功能;览可获得的q接和可获得的数据源列表Q发送参数值数l,索结果数l;索参C数及参数描述Q应用可卷动的光标;索SQL语句和本|索各U目录信息;调用转换DLL?br>2. SQL语法的一致性?br>从SQL斚w可划分ؓ最的SQL语法、核心SQL语法和扩展SQL语法三个{?br>五、ODBC的应用与前景
ODBC的出现给用户描绘了一个诱人的前景Q即|络中的Windows用户可以方便地访问各U数据库。现在,在微软推出的许多产品中都提供了ODBC支持Q如Visal Basic 3.0、Visal C1.5、Excel 5.0、Word 6.0、FoxPro、Access{。同时其他一些应用Y件和开发工具也提供了对ODBC的支持。因此用户只要安装不同的ODBC驱动E序Q就可存取相应的数据库品,而不用户用何U前台应用YӞ也不后台是何种数据库,q个存取?br>本文来自: 公文大全(www.gwdq.com) 详细出处参考:http://www.gwdq.com/lwzx/jsj/jsjll/146960_2.html
q程是一致的?br>但是׃ODBC产生的时间还不长Q其应用也同时存在着一些问题。首先,它的层次比较多,表现在性能上比专有的API要慢Q这是其标准化和开发性所带来的必要的代hQ其ơ,׃ODBC规定了三个层ơ的一致性别,应用E序与驱动程序之间的匚w׃出现一些问题和矛盾Q比如某些驱动程序支持的U别比较低,而应用程序要求的比较高;再者,׃不同的驱动程序ؓ不同的开发商所开发,试工作不能l一Q而现有的开发和试工具q不很完善;同时Q在非SQL的数据库pȝ上的应用也存在一些问题?br>微Y公司ODBC作ؓ一很重要的技术,它已承诺q一步改qODBC技术,为驱动程序开发者提供更先进的开发和试工具Q还交付系l管理和监控工具Q它q将与DBMS厂商和第三方厂商建立更密切的合作Q以期驱动E序支持更高U别的一致性,q在规范化方面有所完善。目前,ODBC已ؓ数据库供应商l织内部所认可Q同时ؓ众多应用软g厂商和第三方开发商所使用Q相信随着SQL的推q和规范Q用户和开发商会更加依赖于q一技?br>本文来自: 公文大全(www.gwdq.com) 详细出处参考:http://www.gwdq.com/lwzx/jsj/jsjll/146960_3.html
]]>
cc -o len len.o -q64 -L/home/sqllib/lib64 -ldb2
len.o:len.c
cc -c -g -q64 -I/home/sqllib/include/ len.c
clean:
rm -f *.o
SQLAllocStmt() 分配新的语句句柄q将其与q接句柄指定的连接相兌。对于在M一个时候可以分配的语句句柄数目没有已定义的限制?
在调用此函数之前Q必调?SQLConnect()?
必须?SQLBindParam()?tt>SQLPrepare()、SQLExecute()、SQLExecDirect() 或Q何其它将语句句柄作ؓ其中一个输入自变量的函C前调用此函数?
语法
SQLRETURN SQLAllocStmt (SQLHDBC hdbc,
SQLHSTMT *phstmt);
函数自变?/strong> 用法
DB2 UDB CLI 使用每个语句句柄来所有描q符、结果倹{游标信息和状态信息与已处理的 SQL 语句相关联。虽然每?SQL 语句都必要有语句句柄,但可以将句柄重新用于不同的语句?
Ҏ函数的调用要?hdbc 引用zd的数据库q接?
要执行定位型更新或删除,应用E序必须不同的语句句柄用于 SELECT 语句?UPDATE ?DELETE 语句?
如果指向语句句柄的输入指针(phstmtQ指向由先前?SQLAllocStmt() 调用分配的有效语句句柄,则此调用的结果是覆盖原始倹{这是应用程序编E错误,DB2 UDB CLI 不检此错误?
q回?/strong>
如果q回 SQL_ERRORQ则 phstmt 自变量设|ؓ SQL_NULL_HSTMT。应用程序应使用同一?hdbc 来调?SQLError() q将 hstmt 自变量设|ؓ SQL_NULL_HSTMT?
诊断 请参?SQLFetch()Q?a >CZQ?
数据cd
自变?
使用
描述
SQLHDBC
hdbc
输入
q接句柄
SQLHSTMT *
phstmt
输出
指向语句句柄的指?
SQLSTATE
描述
说明
08003
q接未打开
hdbc 自变量指定的q接未打开。必L功地为驱动程序徏立连接(q且该连接必d打开Q才能分?hstmt?
40003 *
未知语句是否完成
在函数完成处理之前,CLI 与数据源之间的通信链\发生故障?
58004
pȝ错误
不可恢复的系l错误?
HY001
内存分配p|
驱动E序无法分配支持此函数的执行或完成所必需的内存?
HY009
自变量值无?
phstmt 是空指针
HY013 *
内存理问题
驱动E序无法讉K支持此函数的执行或完成所必需的内存?
]]>
用?/strong>
SQLAllocEnv() 分配环境句柄和相兌的资源?
应用E序必须?SQLAllocConnect() 或Q何其?DB2 UDB CLI 函数之前调用此函数。在以后所有需要环境句柄作入的函数调用中,都传?henv 倹{?
语法
函数自变?/strong> 用法
对于每个应用E序Q在M一个时候都只能有一个活动环境。以后Q何对 SQLAllocEnv() 的调用将q回现有的环境句柄?
~省情况下,?SQLFreeEnv() 所作的W一个成功调用将释放与该句柄相关联的资源。无论成功地调用了多次 SQLAllocEnv()Q都会发生这U情c如果环境属?SQL_ATTR_ENVHNDL_COUNTER 讄?SQL_TRUEQ则在释放与句柄相关联的资源之前Q必Mؓ每次成功?SQLAllocEnv() 调用来调?SQLFreeEnv()?
要确保所有的 DB2 UDB CLI 资源都保持活动状态,调用 SQLAllocEnv() 的程序不应终止或d堆栈。否则,应用E序丢失打开的游标、语句句柄和其它已分配的资源?
q回?/strong>
如果q回 SQL_ERRORQƈ?phenv {于 SQL_NULL_HENVQ则׃没有句柄可以与附加的诊断信息相关联,所以不能调?SQLError()?
如果q回码是 SQL_ERRORQƈ且指向环境句柄的指针不等?SQL_NULL_HENVQ则该句柄是受限句柄。这表示该句柄只能在 SQLError() 的调用中使用以获取更多的错误信息Q或者用?SQLFreeEnv() 的调用?
诊断
有关代码CZ的信息,参见代码不保证声明信?/font>?
参?/strong>
SQLRETURN SQLAllocEnv (SQLHENV *phenv);
数据cd
自变?
使用
描述
SQLHENV *
phenv
输出
指向环境句柄的指?
SQLSTATE
描述
说明
58004
pȝ错误
不可恢复的系l错误?
/*******************************************************
** file = basiccon.c
** - demonstrate basic connection to two datasources.
** - error handling ignored for simplicity
**
** Functions used:
**
** SQLAllocConnect SQLDisconnect
** SQLAllocEnv SQLFreeConnect
** SQLConnect SQLFreeEnv
**
**
********************************************************/
#include <stdio.h>
#include <stdlib.h>
#include "sqlcli.h"
int
connect(SQLHENV henv,
SQLHDBC * hdbc);
#define MAX_DSN_LENGTH 18
#define MAX_UID_LENGTH 10
#define MAX_PWD_LENGTH 10
#define MAX_CONNECTIONS 5
int
main()
{
SQLHENV henv;
SQLHDBC hdbc[MAX_CONNECTIONS];
/* allocate an environment handle */
SQLAllocEnv(&henv);
/* Connect to first data source */
connect(henv, &hdbc[0];);
/* Connect to second data source */
connect(henv, &hdbc[1];);
/********* Start Processing Step *************************/
/* allocate statement handle, execute statement, etc. */
/********* End Processing Step ***************************/
printf("\nDisconnecting .....\n");
SQLFreeConnect(hdbc[0]); /* free first connection handle */
SQLFreeConnect(hdbc[1]); /* free second connection handle */
SQLFreeEnv(henv); /* free environment handle */
return (SQL_SUCCESS);
}
/********************************************************************
** connect - Prompt for connect options and connect **
********************************************************************/
int
connect(SQLHENV henv,
SQLHDBC * hdbc)
{
SQLRETURN rc;
SQLCHAR server[MAX_DSN_LENGTH + 1], uid[MAX_UID_LENGTH + 1],
pwd[MAX_PWD_LENGTH
+ 1];
SQLCHAR buffer[255];
SQLSMALLINT outlen;
printf("Enter Server Name:\n");
gets((char *) server);
printf("Enter User Name:\n");
gets((char *) uid);
printf("Enter Password Name:\n");
gets((char *) pwd);
SQLAllocConnect(henv, hdbc);/* allocate a connection handle */
rc = SQLConnect(*hdbc, server, SQL_NTS, uid, SQL_NTS, pwd, SQL_NTS);
if (rc != SQL_SUCCESS) {
printf("Error while connecting to database\n");
return (SQL_ERROR);
} else {
printf("Successful Connect\n");
return (SQL_SUCCESS);
}
}
]]>
SQLAllocHandle() 分配Mcd的句柄?
语法
SQLRETURN SQLAllocHandle (SQLSMALLINT htype,
SQLINTEGER ihandle,
SQLINTEGER *handle);
函数自变?/strong> 用法
此函数组合了函数 SQLAllocEnv()、SQLAllocConnect() ?SQLAllocStmt()?
如果 htype ?SQL_HANDLE_ENVQ则 ihandle 必须?SQL_NULL_HANDLE。如?htype ?SQL_HANDLE_DBCQ则 ihandle 必须是有效的环境句柄。如?htype ?SQL_HANDLE_DESC ?SQL_HANDLE_STMTQ则 ihandle 必须是有效的q接句柄?
q回?/strong>
数据cd
自变?
使用
描述
SQLSMALLINT
htype
输入
要分配的句柄的类型。必L SQL_HANDLE_ENV、SQL_HANDLE_DBC、SQL_HANDLE_DESC ?SQL_HANDLE_STMT?
SQLINTEGER
ihandle
输入
描述在其中分配新句柄的上下文的句柄;然而,如果 htype ?SQL_HANDLE_ENVQ则q是 SQL_NULL_HANDLE?
SQLINTEGER *
handle
输出
指向句柄的指?
]]>
SQLSetConnectAttr() 讄特定q接的连接属性?
语法
SQLRETURN SQLSetConnectAttr (SQLHDBC hdbc,
SQLINTEGER fAttr,
SQLPOINTER vParam,
SQLINTEGER sLen);
函数自变?/strong> ?146. SQLSetConnectAttr 自变?/a> 用法
通过 SQLSetConnectAttr() 讄的所有连接和语句选项都将持箋到调?SQLFreeConnect() 或下ơ调?SQLSetConnectAttr() 时ؓ止?
通过 vParam 讄的信息的格式取决于所指定?fAttr。选项信息可以?32 位整敎ͼ也可以是指向以空l止的字W串的指针? ?IBM 术语中:
有关“隔离U别”的详l说明,请参?IBM SQL Reference?
应该在调?SQLConnect() 之前讄 SQL_ATTR_COMMIT 属性。如果在建立q接之后更改了|q且该连接是与远E数据源的连接,则在下一ơ对q接句柄成功调用 SQLConnect() 之前Q此更改不会生效? q回?/strong>
诊断 ?148. SQLSetConnectAttr SQLSTATE
指定了无效的 fAttr 倹{?
数据cd
自变?
使用
描述
SQLHDBC
hdbc
输入
q接句柄
SQLINTEGER
fAttr
输入
要设|的q接属性,有关更多信息Q请参?a >?147?
SQLPOINTER
vParam
输入
?fAttr 相关联的倹{根据选项的不同,q可以是指向 32 位整数值的指针Q也可以是字W串?
SQLINTEGER
sLen
输入
如果输入值是字符串的话,此自变量是它的长度Q否则不使用此自变量?
fAttr
内容
SQL_ATTR_AUTOCOMMIT
32 位的|它设|连接的落实行ؓ。可能的值列C如下:
SQL_ATTR_COMMIT
?br>SQL_TXN_ISOLATION32 位的|它设|?hdbc 所引用的当前连接的事务隔离U别。DB2 UDB CLI 接受下列|但每个服务器都可能只支持q些隔离U别的其中某一些:
SQL_ATTR_DATE_FMT
32 位的整数|q个值可以是Q?
SQL_ATTR_DATE_SEP
32 位的整数|q个值可以是Q?
SQL_ATTR_DBC_DEFAULT_LIB
一个字W|q个值指C将用于解析未限定文件引用的~省库。如果连接正在用系l命名方式,则此Ҏ效?
SQL_ATTR_DBC_SYS_NAMING
32 位的整数|q个值可以是Q?
SQL_ATTR_DECIMAL_SEP
32 位的整数|q个值可以是Q?
SQL_ATTR_EXTENDED_COL_INFO
32 位的整数|q个值可以是Q?
SQL_ATTR_TIME_FMT
32 位的整数|q个值可以是Q?
SQL_ATTR_TIME_SEP
32 位的整数|q个值可以是Q?
SQL_SAVEPOINT_NAME
一个字W|它指C?SQLEndTran() 要对函数 SQL_SAVEPOINT_NAME_ROLLBACK ?SQL_SAVEPOINT_NAME_RELEASE 使用的保存点名称?
SQL_2ND_LEVEL_TEXT
32 位的整数|q个值可以是Q?
SQLSTATE
描述
说明
HY001
内存分配p|
驱动E序无法分配支持此函数的执行或完成所必需的内存?
HY009
自变量值无?
l定 fAttr |对自变量 vParam 指定了无效的倹{?
]]>