Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 在perl中创建自己的DBI::Iterator实现_Oracle_Perl_Dbi_Hp Ux - Fatal编程技术网

Oracle 在perl中创建自己的DBI::Iterator实现

Oracle 在perl中创建自己的DBI::Iterator实现,oracle,perl,dbi,hp-ux,Oracle,Perl,Dbi,Hp Ux,更新: 现在,我正在尝试接收一个大约120米行的阵列。我之所以不在UTL_文件上执行此操作,是因为在我们的生产服务器中,它需要oracle用户访问权限才能将写入的平面文件写入并移动到所需的目录中。问题的另一个方面是,在提取之后仍然需要大量的文本操作,我认为这是Perl的工作 我现在想做的是编写自己的DBI::Iterator实现,以及它可能需要的所有其他依赖项;但要清楚,不一定全部。(就像一些只使用DBI的方法一样,然后只使用idb_行…只是为了运行它,因为我无法安装模块) 原始问题: 你好,

更新:

现在,我正在尝试接收一个大约120米行的阵列。我之所以不在UTL_文件上执行此操作,是因为在我们的生产服务器中,它需要oracle用户访问权限才能将写入的平面文件写入并移动到所需的目录中。问题的另一个方面是,在提取之后仍然需要大量的文本操作,我认为这是Perl的工作

我现在想做的是编写自己的DBI::Iterator实现,以及它可能需要的所有其他依赖项;但要清楚,不一定全部。(就像一些只使用DBI的方法一样,然后只使用idb_行…只是为了运行它,因为我无法安装模块)

原始问题:

你好, 我对perl编程比较陌生,一周前我又开始用perl接收内存不足的消息。我以前可以通过切换到64位perl来解决这个问题

我昨天刚刚发现,我的生产机器的内核不允许我使用超过4GB的内存(在我的另一台生产服务器中,我可以将大量数据加载到内存中)

以下是我在生产服务器中的具体限制

  • 我不允许安装新的perl模块
  • 在某种程度上,我被允许在本地安装它们,但我遇到了麻烦
  • 我现在打算做的是重新创建这个模块。

    我没有迭代器的背景。我通过下面的函数开发数据库提取和ETL过程的时间最长。在使用下面的函数一年半后,这是我第一次再次遇到内存不足错误

    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) {
        ...
    }