2012-01-23 5 views
0

私はRose :: DB :: Objectクエリ文字列をArrayまたはHashのどちらかを使って記述しようとしていますが、それをするために。私は配列に列挙されているリスト内の特定のIDに基づいて更新関数を記述しようとしています。残念ながら、クエリをビルドするためにフィルタするための他のユニークなキーがないので、特定のIDをクエリする必要があります。オブジェクトIDのリストを持つRose :: DB :: Object :: Managerクエリ

基本的に私はプログラム的にフォローを記述しようとしています:

my $list = My::DB::Manager->get_items(query => [ 
    {id => 1}, 
    {id => 14}, 
    {id => 210}, 
    {id => 1102}, 
    {id => 3151}, 
]); 

は、これは私がこれまで持っていますが、私は成功した私がやろうとしています何を達成することができていないコードであります今、スクリプトは単に無期限なしの出力でハング

./test.pl

 use My::DB::Manager; 
     my @ary; 
     foreach (@_) { 
      my %col = ("id", $_); 
      push (@ary, \%col); 
     } 
     my $list = My::DB::Manager->get_items(query => \@ary); 
     ... 

私はこのスクリプトが60秒ごとに実行され、大きなセットを返す可能性があるため、DB :: Managerを繰り返し実行することを避け、レ​​コード単位でDB呼び出しを行っています。

答えて

1

パラメータは、ハッシュリファレンスの配列への参照ではなく、名前と値のペアの配列を参照します。 id列の値が値のリストの1つであるオブジェクトが必要な場合は、名前としてidを使用し、IDの配列への参照を値として使用します。このコードは、(ID値が@_であると仮定した場合)動作するはずです:

$list = My::DB::Manager->get_items(query => [ id => \@_ ]); 
+0

これはうまくいった!、それはSybase SQLクエリから収集された配列内の要素に対してエラーを投げたが、その結果は配列の各要素に\ x00が追加され、Oracleクエリを引き起こしている。失敗する。うまくいけばRose :: DBはSybaseのサポートを受けるでしょう。 – Mose

0

あなたはperlの構造をプッシュする必要があるときは、@aryに文字列をプッシュ:

use My::DB::Manager; 
    my @ary; 
    foreach (@_) { 
      push (@ary, { id => $_ }); 
    } 
    my $list = My::DB::Manager->get_items(query => [@ary]); 
    ... 

しかし、私はあなたがquery => [ id => [$id1, $id2, ... ], ...]を使用することができると思う:

use My::DB::Manager; 
    my $list = My::DB::Manager->get_items(query => [ id => \@_ ]); 
    ... 

が、これはのドキュメントに基づいて、ローズを使ったことがありませんモジュール。

+0

私は同様に上記を試してみましたが、私はそれをしようとするどのような方法は、私は、無効なクエリ文字列を取得します。私はほとんどハッシュが必要だと思うが、 "id"は重複するキーなので、ハッシュを使う方法はわからない。 – Mose

関連する問題