免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5440 | 回复: 9
打印 上一主题 下一主题

32位perl如何读取64位oracle? [复制链接]

论坛徽章:
0
1 [报告]
发表于 2016-12-13 23:11 |显示全部楼层
不可能吧,肯定是你哪错了。
Oracle服务器进程通过处理SQL和PL/SQL请求,代表每个用户与SGA进行交互,根本就不会理会客户端是多少位的应用。
我客户端是32 位,用得好好的。
SELECT * FROM v$version;
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE        10.2.0.4.0        Production
TNS for IBM/AIX RISC System/6000: Version 10.2.0.4.0 - Productio
NLSRTL Version 10.2.0.4.0 - Production

论坛徽章:
0
2 [报告]
发表于 2016-12-14 10:17 |显示全部楼层
本帖最后由 hn_weicr 于 2016-12-14 11:04 编辑

回复 3# beyondlee1

我的意思就是32位perl 访问64位oracle。你对“服务”的概念了解是浅了点。
这么说吧,服务对客户端,网络路由等是透明的。这好比一妓女对外提供“服务”,管你是黑人白人大人小孩,
照单全收,日了再说。
另外, Oracler 的 “PL/SQL”是开发语言,不是什么工具。Oracle有个第三方厂家开发的工具叫 pl/sql developer,
还有:有时候,如果客户端确实不好布署,我们可以换个思路,用 DBI的ProxyServer 作为代理,
在很多无法装oracle客户端的unix/linux主机上(要root权限,要重启主机),通过代理也是个不错的选择。

论坛徽章:
0
3 [报告]
发表于 2016-12-14 10:18 |显示全部楼层
本帖最后由 hn_weicr 于 2016-12-14 10:21 编辑

回复 4# laputa73

我常用的就是32位windows, oracle DBI.
其实windows的perl更容易部署,装好一台,把整的目录copy至另一台主机上就可以了。 activeperl安装模块更容易。

论坛徽章:
0
4 [报告]
发表于 2016-12-14 21:02 |显示全部楼层
本帖最后由 hn_weicr 于 2016-12-14 23:12 编辑

xp下就应该下载32位的activeperl。至于DBI等模块,应该用ppm(装好activeperl后,在CMD 下敲ppm就出来)来安装。要学好perl最需要的是不断的思索与折腾。

通过dbi proxyserver来实现也很简单。
./dbiproxy --localport 3333 --mode fork --debug --logfile /dev/tty
Wed Dec 14 22:31:46 2016 debug, Server starting in operation mode fork
Wed Dec 14 22:31:46 2016 notice, Server starting
Wed Dec 14 22:31:56 2016 debug, Connection from 13.71.2.88, port 44020
Wed Dec 14 22:31:56 2016 debug, Child clone: DBI::ProxyServer=HASH(0x3006ba48)

Wed Dec 14 22:31:56 2016 debug, New child starting (DBI::ProxyServer=HASH(0x3006ba48)).
Wed Dec 14 22:31:56 2016 debug, Accepting client from 133.71.24.88, port 44020
Wed Dec 14 22:31:56 2016 debug, Client logs in: Application dbi:Oracle:crmdb1, version 0.2004, user ai_sel
Wed Dec 14 22:31:56 2016 debug, Connecting to dbi:Oracle:crmdb1 as ai_sel
Wed Dec 14 22:31:56 2016 debug, Accepting client
Wed Dec 14 22:31:56 2016 debug, Client executes method Version
Wed Dec 14 22:31:56 2016 debug, Client executes method CallMethod
Wed Dec 14 22:31:56 2016 debug, CallMethod: => DBI::ProxyServer::db=HASH(0x30439ce8),STORE,AutoCommit,1
Wed Dec 14 22:31:56 2016 debug, CallMethod: <= 1
Wed Dec 14 22:31:56 2016 debug, Client executes method CallMethod
Wed Dec 14 22:31:56 2016 debug, CallMethod: => DBI::ProxyServer::db=HASH(0x30439ce8),prepare, SELECT service_num ,subscription_id  FROM hiucrm1o.ucs_subscription WHERE ROWNUM<200,,ARRAY(0x3043a028),1
Wed Dec 14 22:31:56 2016 debug, CallMethod: <= DBI::ProxyServer::st=HASH(0x3043a208),2,0,ARRAY(0x3043a438),ARRAY(0x3043a488),0E0
Wed Dec 14 22:31:56 2016 debug, Client executes method CallMethod
Wed Dec 14 22:31:56 2016 debug, CallMethod: => DBI::ProxyServer::st=HASH(0x3043a208),fetch,20
Wed Dec 14 22:31:56 2016 debug, CallMethod: <= ARRAY(0x30439fc8),ARRAY(0x3043a0a8),ARRAY(0x3043a418),ARRAY(0x3043a538),ARRAY(0x3043a578),ARRAY(0x3043a588),ARRAY(0x3043a5c8),ARRAY(0x3043a608),ARRAY(0x3043a648),ARRAY(0x3043a688),ARRAY(0x3043a6c8),ARRAY(0x3043a708),ARRAY(0x3043a748),ARRAY(0x3043a788),ARRAY(0x3043a7c8),ARRAY(0x3043a808),ARRAY(0x3043a848),ARRAY(0x3043a888),ARRAY(0x3043a8c8),ARRAY(0x3043a908)


结果:

13198||5723
13016||576478
13016||576919
13016||56508
130008||80072
1303352||574390
13004630||80647
130162||565541
1309890||5643
13005001||80
130397||800

。。。。。。。。。。。。。。。。
。。。。。。。。。

测试草码(基本上就是仿模块内的测试代码)

$ vi b.pl
use strict;
use DBI;
$ENV{DBI_AUTOPROXY}='dbi:Proxy:hostname=133.2.2.5;port=3333';
my ($dbh,$sth);
my $user = 'ai_sel';
my $pass ='jbjbjbjb';
my $remote="dbi:Oracle:crmdb1";
$dbh = DBI->connect($remote, $user, $pass) ||die "connect did not work: $DBI::errstr";
my $sql = " SELECT service_num ,subscription_id
                  FROM hiucrm1o.ucs_subscription
                  WHERE ROWNUM<200";
printf $sql."\n";
$sth=$dbh->prepare($sql);
$sth->execute();
my @ora_cursors=();
while(@ora_cursors=$sth->fetchrow_array)
{
  print  $ora_cursors[0]."||".$ora_cursors[1]."\n";

$sth->finish();
$dbh->disconnect();           

论坛徽章:
0
5 [报告]
发表于 2016-12-14 22:51 |显示全部楼层
本帖最后由 hn_weicr 于 2016-12-15 08:42 编辑

回复 9# fender0107401
那我就不太清楚了。我的生产环境是AIX+64位oracle 机群,一般我写应用都先在windows7 (32位)下反复折腾(人笨)好再移至unix/linux上。
我个人本本上用的activeperl 是从官网下的,模块都是用ppm安装的,非常顺。
后来我试过,把整个perl_home tar出来,在windows32的机子上解tar 就行了。

小结一下:为了节省时间不折腾
                   32位的windows 就应装32位的oracle客户端,装32位的activeperl,然后用ppm装相关模块
                   64位的windows就应装64位的oracle客户端,装64位的activeperl,然后用ppm装相关模块。

论坛徽章:
0
6 [报告]
发表于 2016-12-15 09:31 |显示全部楼层
本帖最后由 hn_weicr 于 2016-12-15 09:51 编辑

一、有关环境变量,可以不需要,我只是顺手抄示范代码
my $proxy='dbi.Proxy:hostname=133.2.2.5;port=3333';
my $remote="dbi:Oracle:crmdb1";
$dbh = DBI->connect($proxy.";dsn=".$remote, $user, $pass) ||die "connect did not work: $DBI::errstr";
二、装好DBI,这模块就有了。当然了,还有好多关联模块的。
不建议用windows下的activestate来作服务端。

你还是得到cpan好好看模块说明文档。


另外,依稀记得在学校念书时在哪本中文版的书上看过有关dbi proxyserver的描述。 好象是《perl DBI 》(有个动物,估计是oreilly公司的产品),你找这本书的电子版看看。

论坛徽章:
0
7 [报告]
发表于 2016-12-15 09:31 |显示全部楼层
本帖最后由 hn_weicr 于 2016-12-15 09:50 编辑

重复了重复了。

论坛徽章:
0
8 [报告]
发表于 2016-12-15 12:43 |显示全部楼层
本帖最后由 hn_weicr 于 2016-12-15 12:50 编辑

你还是认认真真看文档吧。 host_name是proxyserver所在的IP地址, port是代理服务器对外的服务端口。
客户端是通过代理服务器间接实现与oracle交互的。
                                port=3333                    port=1521(oracle默认)
client<------------> Proxyserver<----------> Oracle server( SGA+instance)
就是client向Proxyserver 发起SQL,Proxyserver收到后向oracle发起查询或操作并把结果返给client.

$ENV{DBI_AUTOPROXY}='dbi:Proxy:hostname=133.2.2.5;port=3333'; 指明 本程序的查询由位于133.2.2.5 的proxyserver代理,Proxyserver的服务端口是3333.
$remote="dbi:Oracle:crmdb1" 指的是远程真正oracle服务器。“crmdb1”是proxyserver主机的$ORACLE_HOME/network/admin/tnsnames.ora 有定义item的,指明了oracle服务器的IP及端口.
只要client端在代码中指明$remote 参数以及 帐户密码还有sql,client端就可以实现对不同数据库的查询(Proxyserver主机一般都有装不同种类的DBI 驱动,比如odbc,oracle,mysql,
altibase等)。

论坛徽章:
0
9 [报告]
发表于 2016-12-15 17:23 |显示全部楼层
本帖最后由 hn_weicr 于 2016-12-15 17:34 编辑

回复 17# beyondlee1
ODBC是微软自家的数据库接口标准,访问SQLserver当然应没问题?(从没用过SQLserver,想当然)。
ODBC是为了统一、方便用户访问数据库而设计的一系列协议,
但要访问其他非微软数据库,最终还是要调用对方提供的库的。比如:要访问oracle就得调用OCI,那就得安装oracle的客户端(主要是获得库文件)。
也就是说:不管是ODBC、ADO还是 DBD要访问oracle,都得装ORACLE的客户端。
DBI Proxyserver的好处是:在你的公司内,只要已有一台主机能直接访问oracle(或其他数据库), 在该主机上安装
DBIProxyserver,其他主机或工作台就可以通过访代理server间接访问从代理主机能访问到的任一数据库,
而不需要在每一台工作站或主机上都安装oracle或其他数据库的客户端。(很多主机要安装Oracle客户端是需要root权限并要求重启的)


你说的一定要上网是啥意思?不太明白。
从我上面画的草图看:只要你程序所部署工作站能访问代理server,代理server又能访问到你要访问的数据库就可以了。
这与海外代购同是一回事,你不能直接从日本买马桶,让日本人帮你买,再寄给你,最终效果是一样的(你得到了马桶)。

论坛徽章:
0
10 [报告]
发表于 2016-12-15 17:30 |显示全部楼层
回复 20# beyondlee1
既然你能能过odbc来访问,那说明你的oracle客户端是32位的了。
那问题可能出在 DBD-Oracle-XXX模块的安装上。
用ppm来安装应该就不会有问题的。
你再折腾吧。


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP