Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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
如何使用Perl对Oracle数据库执行SQL查询并将结果作为JSON?_Sql_Json_Oracle_Perl - Fatal编程技术网

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

如何使用Perl对Oracle数据库执行SQL查询并将结果作为JSON?,sql,json,oracle,perl,Sql,Json,Oracle,Perl,我正在使用一个遗留系统,需要使用Perl从Oracle数据库中获取数据。Perl是我不花太多时间研究的语言之一,因此我希望能够运行一个简单的SQL查询,并通过JSON将数据传递给另一个系统 在这个系统上似乎可以使用JSON、DBI和DBD。如果可能的话,我希望在不对系统进行太多更改或更新的情况下完成这项工作。我相信JSON库的版本是5.12.2 我发现,我相信这正是我所需要的: #!/usr/bin/perl -l use strict; use warnings; $|++; use JSO

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

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

我发现,我相信这正是我所需要的:

#!/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.
我在该存储库中搜索了源代码的其余部分,没有看到任何
我的json_encode
定义,因此我可能认为json库的版本太旧了,但
json_encode
方法似乎不太可能更改名称

下一步 在我获得
json\u 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)
my @records;
while (my $r = $sth->fetchrow_hashref)
{
    push(@records, $r);
}
$sth=$dbh->prepare(“从挂起=1的记录中选择*);
$sth->execute;
my$records=新哈希;
而($r=$sth->fetchrow\u hashref)
{

$records根据模块的文档,您需要的函数是
encode_json
而不是
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)
my @records;
while (my $r = $sth->fetchrow_hashref)
{
    push(@records, $r);
}
如果您知道要在哪个字段上键入哈希值:

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

是的!它工作得更好!我现在得到了一个
散列或arrayref,这是我期望的,但可能可以解决这个问题!