在论坛上有朋友询问关于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。 |