[转帖]TUXEDO 与 ORACLE 动态方法四的应用示例_MQ, Tuxedo及OLTP讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MQ, Tuxedo及OLTP讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 4714 | 回复: 0   主题: [转帖]TUXEDO 与 ORACLE 动态方法四的应用示例        下一篇 
zhou
注册用户
等级:中校
经验:2210
发帖:125
精华:6
注册:2012-11-19
状态:离线
发送短消息息给zhou 加好友    发送短消息息给zhou 发消息
发表于: IP:您无权察看 2012-11-28 9:15:59 | [全部帖] [楼主帖] 楼主

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。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论