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[i]);

sprintf(tmpbuf,”%d”,*select_dp->I[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。