Oracle 在perl中创建自己的DBI::Iterator实现
更新: 现在,我正在尝试接收一个大约120米行的阵列。我之所以不在UTL_文件上执行此操作,是因为在我们的生产服务器中,它需要oracle用户访问权限才能将写入的平面文件写入并移动到所需的目录中。问题的另一个方面是,在提取之后仍然需要大量的文本操作,我认为这是Perl的工作 我现在想做的是编写自己的DBI::Iterator实现,以及它可能需要的所有其他依赖项;但要清楚,不一定全部。(就像一些只使用DBI的方法一样,然后只使用idb_行…只是为了运行它,因为我无法安装模块) 原始问题: 你好, 我对perl编程比较陌生,一周前我又开始用perl接收内存不足的消息。我以前可以通过切换到64位perl来解决这个问题 我昨天刚刚发现,我的生产机器的内核不允许我使用超过4GB的内存(在我的另一台生产服务器中,我可以将大量数据加载到内存中) 以下是我在生产服务器中的具体限制Oracle 在perl中创建自己的DBI::Iterator实现,oracle,perl,dbi,hp-ux,Oracle,Perl,Dbi,Hp Ux,更新: 现在,我正在尝试接收一个大约120米行的阵列。我之所以不在UTL_文件上执行此操作,是因为在我们的生产服务器中,它需要oracle用户访问权限才能将写入的平面文件写入并移动到所需的目录中。问题的另一个方面是,在提取之后仍然需要大量的文本操作,我认为这是Perl的工作 我现在想做的是编写自己的DBI::Iterator实现,以及它可能需要的所有其他依赖项;但要清楚,不一定全部。(就像一些只使用DBI的方法一样,然后只使用idb_行…只是为了运行它,因为我无法安装模块) 原始问题: 你好,
sub myDBI
{
my ($filename) = @_;
my $query = "";
unless(open(FILE,$filename))
{
Logger("[ ERR ] unable to open $SETTINGS{SQL_TRIGGER}\n");
print
die;
}
my @result=`sqlplus -S $SETTINGS{USER_NAME}/$SETTINGS{PASSWORD}\@$SETTINGS{DB_NAME} <<END
SET HEADING OFF
SET FEEDBACK OFF
SET SERVEROUTPUT ON
SET LINES 5000
SET COLSEP "||"
$query
/
`
;
@result;
}
子myDBI
{
我的($filename)=@;
我的$query=“”;
除非(打开(文件$filename))
{
记录器(“[ERR]无法打开$SETTINGS{SQL_TRIGGER}\n”);
打印
死亡
}
my@result=`sqlplus-S$SETTINGS{USER_NAME}/$SETTINGS{PASSWORD}\@$SETTINGS{DB_NAME}您有几个选项:
- 如果您已经安装了,您可以将诸如Iterator::DBI之类的CPAN模块安装到用户目录中。您只需要设置一些环境变量来指定要使用的目录
export PERL_MB_OPT='--install_base /home/username/perl5'
export PERL_MM_OPT='INSTALL_BASE=/home/username/perl5'
export PERL5LIB='/home/username/perl5/lib/perl5/i386-linux:/home/username/perl5/lib/perl5'
export PATH="/home/username/perl5/bin:$PATH"
- 实际上,您不需要迭代器::DBI。该模块只是将迭代器对象包装在DBI语句句柄周围,DBI语句句柄本身就是迭代器。因此,您可以直接使用DBI连接到数据库。(请注意,无论哪种方式,您都将直接连接到数据库,而不是通过sqlplus连接。)
- 如果您真的想使用Iterator::DBI而无法安装该模块,您可以直接复制该模块,并将其放在与应用程序相关的
/Iterator/DBI.pm
中。但问题是您需要绕过依赖项。为此,我将用一个简单的die
或croak替换异常e> ,并用闭包替换迭代器
(有关如何操作,请参阅的第5章)
- 如果您真的无法让DBI工作,那么可以将sqlplus输出通过管道传输到一个文件,并对该文件进行迭代
您似乎没有真正提出一个问题。您看到了什么行为?您希望看到什么行为?开放式设计问题不是堆栈溢出的原因。您好,谢谢您的建议,我更新了我的问题。我希望能够实现我自己版本的idb_rows,它是DBI::Iterator中的一个函数,只需beca使用我不允许在我的生产服务器中安装模块。我上面发布的代码在我的新服务器中无法运行,因为我的内存不足。这将是我第一次使用perl迭代器。提前再次感谢。感谢您将尽快尝试此操作并再次与您联系。我还看到迭代器::DBI还需要一些模块rom DBI,尤其是数据库处理程序。我还可以将源代码保存为另一个pm文件吗?DBI是perl安装中应该包含的核心模块。我在运行测试时遇到一些错误(ch04/listdsns:枚举所有数据源和所有已安装的驱动程序#)在下面的链接中,BEGIN failed--编译在/opt/perl_64/lib/site_perl/5.8.8/IA64.ARCHREV_0-thread-multi-LP64/DBD/Proxy.pm第29行中止。编译在require处失败(eval 15)第3行。可能DBD::Proxy所需的模块尚未完全安装在./ulimit.pl第16行
您可能不会使用该模块,因此您应该能够跳过该测试。请确保该测试适用于DBD::Oracle驱动程序。我喜欢只复制*.pm共享的想法,它在我的代码中会是什么样子?我将如何使用它?
use DBI;
my $dbh = DBI->connect(...);
my $sth = $dbh->prepare($sql_query);
$sth->execute(@params);
# iterate
while (my $row = $sth->fetchrow_arrayref) {
...
}