0

同じ行でこれを行うためのより良い方法があると確信していますが、私はPerlの初心者なので、その方法を理解することはできません。基本的に私がする必要があるのは、結果を選択、削除、カウントすることです。

$sth = $dbh->prepare("SELECT env,server, mwp.is_reference where env='$ARGV[1]';");
$sth->execute();

$sth2 = $dbh->prepare("delete from mwp.is_info_package where env='$ARGV[1]'");
$sth2->execute();

$sth3 = $dbh->prepare("SELECT count(1) from mwp.is_reference where env='$ARGV[1]'");
$sth3->execute()

目的は、3回実行する代わりに、同じ行で3つのクエリを使用する方法です。

4

3 に答える 3

2

プレースホルダー('?')を使い始めることができます。

my @qlist
    = ( 'SELECT env,server FROM mwp.is_reference where env=?'
      , 'DELETE mwp.is_info_package WHERE env=?'
      , 'SELECT count(1) FROM mwp.is_reference where env=?'
      );

そして、次のようにそれらを繰り返すことができます。

my $env = $ARGV[1];

foreach my $query ( @qlist ) { 
    $dbh->prepare( $query )->execute( $env );
    Carp::croak( $dbh->errstr ) if $dbh->err;
}

しかしもちろん、あなたは本当に2つの出力を選択したいのではありませんか?

use Carp qw<croak>;

my $select_query = 'SELECT env,server FROM mwp.is_reference where env=?';
my $delete_query = 'DELETE mwp.is_info_package WHERE env=?';
my $count_query  = 'SELECT count(1) FROM mwp.is_reference where env=?';
my %empty_atts;

my $rows 
    = $dbh->selectall_arrayref( $select_query, \%empty_atts, $env )
    ;
croak( $dbh->errstr ) if $dbh->err;
$dbh->prepare( $delete_query )->execute( $env );
croak( $dbh->errstr ) if $dbh->err;
my ( $count ) 
    = $dbh->selectrow_array( $count_query, \%empty_atts, $env )
    ;
croak( $dbh->errstr ) if $dbh->err;
于 2012-04-18T12:12:43.543 に答える
0

次のクエリステートメントを使用して問題を解決しました。

$sth = $dbh->prepare("select env,iserver, ( select count(1)  from is_reference where env='$ARGV[1]' ) as total from is_reference where env='$ARGV[1]'");

最もエレガントな方法ではありませんが、行数を減らすことで私の問題を解決しました。削除クエリに関しては、別の条件に移動して、テーブルにデータがあるかどうかを確認しました。

皆さんありがとう。

于 2012-04-19T11:29:24.520 に答える
-1

これらの関数を実行し、選択の結果とカウントを返すストアドプロシージャを使用すると、次の操作を行うだけで済みます。

 my $sth = $dbh->prepare("EXEC procedure_name ?");
 $sth->execute( $ARGV[1] );

余談ですが、prepareとexecuteを使用する方法は望ましくありません。クエリに直接Perl変数を含める必要がないように、prepareを使用します。execute()Perl変数は、に与えられた文字列の一部ではなく、値として渡される必要がありますprepare()。SQLインジェクション攻撃からの保護など、これを行う理由はいくつかあります。

また、前回のSQLクエリに奇妙な点があることに気づきました。私はあなたがおそらく欲しいと思います

SELECT count(env) FROM mwp.is_reference where env=?

それ以外の場合は、カウントとして常に「1」が返されます...同様に、何か面白いことを行うデータベーストリガーがない限り、この方法で最初と最後のクエリを1つに組み合わせることができます(count(1)これは、本当にあなたが行う場合に備えて残しておきます)欲しいです):

 my $sth = $dbh->prepare('SELECT env,server FROM mwp.is_reference where env=?');
 $sth = $sth->execute( $ARGV[1] );
 my $result_set = $sth->fetchall_arrayref();
 my $count = scalar @{ $result_set };

$result_set結果を含むARRAYRefsのARRAYへの参照になります。$countその結果セットの行数が含まれます。

于 2012-04-18T13:18:43.623 に答える