1

私が取り組んでいる現在のコード ベースは、その場しのぎの条件付き文字列連結でいっぱいで、明確な SQL クエリとは言えません。私はそれらを保守可能にしたいのですが、DBIx::Classを使用するのは複雑すぎて今のところ (巨大なレガシー ベース) に移行できないため、何らかの SQL ジェネレーターを使用して、少なくともそれらをより堅牢にすることを検討しています。オブジェクト指向またはその他のクリーンな手法で SQL を作成します (DB の処理は不要です)。

そのジェネレーターに対する一般的な制約の 1 つは、ストアド プロシージャを適切な方法で使用できることです。これは、私のアプリケーションはほとんどストアド プロシージャに基づいているためです。たとえば、私はする必要がありSELECT * FROM StoredProcedure(Parameter) WHERE ...ます。Fey::SQLSQL::Abstractなどを調べましたが、この種のステートメントの「インライン SQL」以外のサポートは見当たりませんでした。DBIx::ClassEXECUTE ...でさえサポートされていません。率直に言って本当に信じられません。おそらく間違った場所を探していたのでしょう。

私は実際にFey::SQLのアプローチが好きでしたが、ある種のスキームが必要であることがわかりました:

 $select->select( $user->columns( 'user_id', 'username' ) )
     ->from( $user, $group )
     ->where( $group->group_id, 'IN', 1, 2, 3 )
     ->and  ( $func, 'LIKE', 'smith%' );

あなたは何をお勧めします?

4

2 に答える 2

3

SQL::Abstractを試すことができます。単純な SQL ステートメントに適しています

于 2009-10-30T21:12:24.660 に答える
1

主な問題は、私が何をしているのか理解していないことだと思いますfunction(?)?というストアド プロシージャに渡されるプレースホルダはありfunctionますか? また、これについての理解をテストできるデータベースにアクセスすることもできません。しかし、次のことは本当にうまくいきませんか?

my $sql = SQL::Abstract->new;

my ($st, @values) = $sql->select(
    \'function(?)',
    '*',
    { group_id => { 'IN' => [ 1 .. 3] } },
);

my $sth = $dbh->prepare($st);
$sth->execute('arg1', @values);

私の場合、$st含まれています:

SELECT * FROM function(?) WHERE ( group_id IN ( ?, ?, ? ) )

それでもうまくいかない場合は、次のようにします。

my ($st, @values) = build_select_for_function(
    function => [ qw(arg1) ],
    '*',
    { group_id => { 'IN' => [ 1 .. 3] } },
);

print $st, "\n";


sub build_select_for_function {
    my ($func, $args, @sql_abstract_args) = @_;
    my $func_str = sprintf '%s(%s)', $func, join(',', @$args);

    my $sql = SQL::Abstract->new;
    $sql->select(
        \$func_str,
        @sql_abstract_args,
    );
}

出力:

SELECT * FROM function(arg1) WHERE ( group_id IN ( ?, ?, ? ) )
于 2009-10-30T21:16:26.260 に答える