如何使用Perl对Oracle数据库执行SQL查询并将结果作为JSON获取?

时间:2014-10-17 00:51:29

标签: sql json oracle perl

我正在使用遗留系统,需要使用Perl从Oracle数据库中获取数据。 Perl是我不会花费很多时间的语言之一,因此我希望能够运行简单的SQL查询并通过JSON将数据传递到另一个系统。

似乎JSON,DBI和DBD在此系统上可用。如果可能的话,我希望在不对系统进行太多更改或更新的情况下完成此操作。我相信JSON库的版本为5.12.2

我找到了DBI-Link library on Github,我相信this file几乎正是我所需要的:

#!/usr/bin/perl -l
use strict;
use warnings;

$|++;
use JSON;
use DBI;
use DBD::Oracle qw(:ora_types);

my $dbh = DBI->connect(
    'dbi:Oracle:host=localhost;sid=xe',
    'hr',
    'foobar',
    {
        AutoCommit => 1,
        RaiseError => 1,
    }
);

my @methods = qw(table_info column_info primary_key_info);
foreach my $method (@methods) {
     if ( $dbh->can($method) ) {
         print "Handle has method $method. w00t!"
     }
     else {
         $dbh->disconnect;
         print "Sadly, handle does not have method $method. D'oh!";
         exit;
     }
}

my $sth=$dbh->table_info('%', '%', '%', 'TABLE');
while(my $table = $sth->fetchrow_hashref) {
    my $t;
    $t->{'Table Name'} = $table->{TABLE_NAME};
    $t->{'Column Info'} = $dbh->column_info(
        undef,
        $table->{TABLE_SCHEM},
        $table->{TABLE_NAME},
        '%'
    )->fetchall_arrayref({});
    $t->{'Primary Key Info'} = $dbh->primary_key_info(
        undef,
        $table->{TABLE_SCHEM},
        $table->{TABLE_NAME}
    )->fetchall_arrayref({});
    print map {"$_: ". json_encode($t->{$_})} grep{ defined $t->{$_} } 'Table Name', 'Column Info', 'Primary Key Info';
    print;
}
$sth->finish;
$dbh->disconnect;

错误

我已经安装了依赖项,但是当我运行它时,我得到了:

Undefined subroutine &main::json_encode called at ./oracle.t line 47.

我搜索了该存储库中的其余源代码并且没有看到任何my json_encode定义,所以也许我有一个版本太旧的JSON库是我可能的想法,但似乎json_encode方法不太可能改变名称。

后续步骤

在我json_encode工作后,我知道我需要执行自定义查询然后保存数据,它将是这样的:

$sth = $dbh->prepare("select * from records where pending = 1");
$sth->execute;
my $records = new HASH;
while($r = $sth->fetchrow_hashref)
{
    $records << $r
}

my $json = json_encode($records)

但是我不确定如何构建$ records对象进行编码,所以任何帮助都会受到赞赏。我已经搜索了stackoverflow,google和github以获取oracle到json的perl示例,并且只运行了DBI-Link repo中的代码。

1 个答案:

答案 0 :(得分:2)

根据JSON模块的文档,您想要的功能是encode_json而不是json_encode

我可能会将记录存储在一组哈希中;像这样的东西:

my @records;
while (my $r = $sth->fetchrow_hashref)
{
    push(@records, $r);
}

如果您知道要键入哈希哈希的字段:

my %records;
while (my $r = $sth->fetchrow_hashref)
{
    $records{ $r->{key_field} } = $r;
}