【问题标题】:Perl DBI case insensitive methodsPerl DBI 不区分大小写的方法
【发布时间】:2019-10-04 13:30:36
【问题描述】:

我正在尝试使 DBI 中的 selectall_arrayref 子例程返回不区分大小写的哈希键。例如:

my $dbh = DBI->connect('dbi:Oracle:' . 'host','user','pass',
        {
            RaiseError => 1, 
            PrintError => 0,
            AutoCommit => 1
        }
        ) || die( $DBI::errstr . "\n" );
$dbh->do('alter session set NLS_COMP=LINGUISTIC'); # this doesn't work 
$dbh->do('alter session set NLS_SORT=BINARY_CI'); # this doesn't work


my $query = 'select test_id from test_table';
my $result = $dbh->selectall_arrayref($query, {Slice=>{}});

print(@$result[0]->{TEST_ID}); #works   
print(@$result[0]->{test_id}); #does not work but I want to make it work
print(@$result[0]->{tEsT_Id}); #does not work but I want to make it work

我知道 DBI 有这个设置:

$dbh->{FetchHashKeyName} = 'NAME_uc' #upper case keys
$dbh->{FetchHashKeyName} = 'NAME_lc' #lower case keys
$dbh->{FetchHashKeyName} = 'NAME' #default

是的,如果我设置其中之一,它适用于相应的情况,但我想以某种方式重写 selectall_arrayref 子例程以返回不敏感的键,所以我可以使用小写、大写或组合的小写和大写。

我怎样才能实现这样的目标?

我也有兴趣在 DBI 的其他子程序上实现这一点。

我目前使用 DBD::Oracle for Oracle 和 DBD::Sybase for Microsoft SQL Server。
谢谢,

【问题讨论】:

    标签: perl dbi


    【解决方案1】:

    你不能。 Perl 没有不区分大小写的字符串。

    最接近的方法是使用NAME_lc,然后将每个值传递给lc,然后再尝试将其用作键名。

    【讨论】:

    • 有没有办法覆盖 DBI 中的子例程以强制哈希键小写?因此,当用户请求 @$resutls[0]->{hAsHkEy} 时,'hAsHkEy' 会自动变为小写?
    • @rooger 这就是绑定返回的数据结构的方式。但是您必须在返回的数组中绑定每个散列。您可以将每个哈希与Tie::CPHash:tie %$_, 'Tie::CPHash' for @$results 联系起来。但请注意,这可能会显着减慢您的程序。 Variable::Magic 将是一个更快的解决方案,但在这种情况下没有现成的选项。 -- 但最后,我只是告诉用户将所有输入小写,这是一个常见的习惯用法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2013-03-06
    相关资源
    最近更新 更多