TUXEDO 与 ORACLE 动态方法四的应用示例
TUXEDO,
ORACLE,
示例,
动态,
转帖
好友彭建新作品
在论坛上有朋友询问关于TUXEDO和ORACLE的PROC动态方法四的相应问题,当时只是对提出问题点进行了相应的回答,现将一个完整的示例贡献给大家,希望对大家有所帮助。
程序运行的环境说明:
P4 1.7GHZ,内存512MB,
操作系统:WINDOWS 2000 SERVER
BEA TUXEDO 8.1 For WINDOWS 2000
BEA TUXEDO 6.5 For WINDOWS NT
数据库:ORACLE 8.16
采用非XA的连接方式
用同步调用通讯方式进行数据的传输。
下面将程序的主要部分给大家做一下说明:
程序例子名称:ORADYN4
源程序打包为ZIP文件,供大家下载:
BEA TUXEDO和数据库的结合彰显它的强大,ORACLE数据库是当今非常流行的主流数据库,ORACLE数据库和BEA TUXEDO的结合可以完成多种功能。ORACLE提供了PRO*C编程可以和BEA TUXEDO实现紧密的结合,而在PRO*C中动态方法中,动态方法四,无疑是这四种方法中最难的一种,同时它也是四种方法中最为灵活的一种。和其它方法不同的是:动态方法四是由程序来控制数据类型的转换,而不是ORACLE和C之间的数据类型自动实现转换。
下面我结合程序讲解一下BEA TUXEDO和ORACLE动态方法四编程实现,动态查询。
程序利用了同步通信方式实现了数据的传输(TPCALL),在BEA TUXEDO的通信方式中,同步是用的多而且比较简单的方式,由于需要把重点放在怎么样可以实现和ORACLE 动态方法四的结合,就不在详细说通信方式了。
程序的大致过程是:把一个动态SQL语句从客户端发起请求到服务端,服务端把请求的SOL语句在服务端执行后,把执行的结果传输到客户端,客户端打印传输的结果。在ORADYN4例子中用的是ORACLE数据库自带的用户SCOTT/TIGER,通过SELECT * FROM EMP 来实现从服务端的读取数据,并把得到的数据的结果传输到客户端这样一个过程。
客户端程序流程:
1、 申请缓冲区
2、 请求服务端
3、 接受数据,并打印到文件
重点介绍客户端打印接收到的结果数据,在FML类型函数中,Ffprint函数是用来打印调试程序的。 先定义一个FILE类型指针fp,用来创建一个文件和打开文件,之后用Ffprint函数把接收到的数据打印到文件。程序如下:
FILE *fp; /*定义一个文件指针*/
fp = fopen("fmlReturn.txt","w");/*打开文件*/
if (fp == NULL)
{
userlog("conorasvr fopen svrrcv.txt failed");
exit(1);
}
Ffprint(RcvBuf,fp); /*把缓冲区的数据输出到文件中)
fclose(fp);/*关闭文件指针*/
OraDynCli.c中有程序的注释语句,详细说明了客户端程序。
服务端程序流程:
1. 接受数服务端请求
2. 将执行的结果数据写入缓冲区
3. 把结果返回到客户端
重点说把数据写入到缓冲区中,这是一个有一定难度的点,需要向缓冲区中写入字段名,以及字段的值,同时在写入字段值的时候还需要判断此字段的值是否为空。
程序如下:
/* 向缓冲区SndBuf中写入EMP表的字段名*/
{
userlog ("input number %d field into SndBuf buffer.\n",i);
userlog ("input FML EMPSTR with field name:%s\n",title);
Fchg(SndBuf,EMPSTR,OccCount,title,(FLDLEN)0);
OccCount++;
}
/* 向缓冲区SndBuf中写入EMP表的字段值 */
{ /*判断是否是空值,并写入到缓冲内*/
userlog ("input number %d field into SndBuf buffer.\n",i);
userlog ("input FML EMPSTR with current record I value %d\n",*select_dp->I
);
sprintf(tmpbuf,"%d",*select_dp->I);
userlog("%s\n",tmpbuf);
Fchg(SndBuf,EMPSTR,OccCount,tmpbuf,(FLDLEN)0);
OccCount++;
if (strcmp(tmpbuf,"0")) /*如果是空的处理程序*/
{
userlog("true\n");
sprintf(tmpbuf,"%s","NULL");
userlog ("input FML EMPSTR with NULL value %s",tmpbuf);
Fchg(SndBuf,EMPSTR,OccCount,tmpbuf,(FLDLEN)0);
OccCount++;
}
/*不空的情况*/
…… /*省略,见源程序*/
}
在程序的末尾还加入了对表的字段个数和记录的条数的统计,如下:
记录的条数的统计实现语句:
Fchg(SndBuf, ROWLEN, 0, (char *)&row_len, (FLDLEN)0);
字段的个数的统计实现语句:
Fchg(SndBuf, COLLEN, 0, (char *)&col_len, (FLDLEN)0);
对程序的介绍大致如上,下面是重要的一环:程序编译和执行
在ORADYN4的当前目录下依次执行下面的操作:
1. 设置环境变量:
SETENV
注意:根据系统的和相关软件的位置不同做相应的更改。
2. 编译客户端程序:
buildcleint -o OraDynCli -f OraDynCli.c
3. 编译服务端程序:
预编译PROC程序:PROC OraDyn.pc
buildserver -o OraDyn -f OraDyn.c -s DYN4 -r Oracle_XA
4. 编译UBB文件:
tmloadcf -y UBB
注意:根据系统的和相关软件的位置不同做相应的更改。一定要注意把机器名写成你自己机器的名字呀:)。
5. 启动服务:
tmboot -y
正确的启动服务显示下面的信息:
Booting admin processes ...
exec BBL -A :
process id=2428 ... Started.
Booting server processes ...
exec OraDyn -A :
process id=2300 ... Started.
2 processes started.
6. 执行程序:
OraDynCli
如果程序正确的执行了,在ORADYN4目录下,应该有一个fmlReturn.txt文件,打开文件里的内容如下:(仅取一部分解释)
------------------------------------------------------------------------------------
(FLDID(8694)) 14 /*得到记录数*/
(FLDID(8695)) 8 /*得到字段的个数*/
(FLDID(41461)) select * from emp /*请求的SQL语句*/
-------------------------------------------------------------------------------------
(FLDID(41464)) EMPNO /*下面的8个是字段名*/
(FLDID(41464)) ENAME
(FLDID(41464)) JOB
(FLDID(41464)) MGR
(FLDID(41464)) HIREDATE
(FLDID(41464)) SAL
(FLDID(41464)) COMM
(FLDID(41464)) DEPTNO
-----------------------------------------------------------------------------------------
(FLDID(41464)) 0 /*下面是第一条记录的值*/
(FLDID(41464)) 7369
(FLDID(41464)) 0
(FLDID(41464)) SMITH
(FLDID(41464)) 0
(FLDID(41464)) CLERK
(FLDID(41464)) 0
(FLDID(41464)) 7902
(FLDID(41464)) 0
(FLDID(41464)) 17-12\d4\c2-80
(FLDID(41464)) 0
(FLDID(41464)) 800.00
(FLDID(41464)) -1
(FLDID(41464)) NULL
(FLDID(41464)) 0
(FLDID(41464)) 20
在上面的16行中,两个为一组,第一个如果是0,表示这个结果非空,第二个将显示正确的结果值,如果是-1的话,则显示一个NULL值,在实际中,还需要编写程序来处理。
还有一点要注意的就是日期的结果是17-12\d4\c2-80,这是在字符集是SIMPLIFIED CHINESE_CHINA.ZHS16GBK情况下,未经处理的结果,请读者自己处理;当字符集是American_America.US7ASCII时,则无须处理,得出的结果就是17-DEC-1980。
通过这篇文章,希望大家了解到怎么样使TUXEDO和ORACLE动态方法四结合起来,协同工作。由于是讲解两者的结合,所以没有过多的介绍ORACLE的动态方法四的内容,大家可以参考相关的书籍对动态方法四,进行系统的了解。
在程序示例中,有详细的注释语句,在此就不一一赘述。
程序示例在WINDOWS 2000 SERVER 上的TUXEDO6.5和TUXEDO8.1两个版本上通过。
参考资料:Pro*C/C++ Precompiler Programmer's Guide (注:oracle公司帮助文档)。
参考程序:ORACLE 安装目录下的precomp\demo\proc\sample10\sample10.c。