擬似行番号に関して、様々な事例を検索しましたが、perlスクリプト上でのmysqlコマンドが使えません。

当方が探しました、二つの有力と思われる方法に間違えがあればご指摘くださいませ。>_<
環境:mysql5.1

my $sth = $dbh->prepare("set @n=0;select @n := @n+1 as rownum, name from lnk");
又は、
my $sth = $dbh->prepare("select @rownum := 0 union all select @rownum := @rownum + 1 as rownum, name from lnk");

$sth -> execute();
while(my @ary = $sth->fetchrow){
@ary は空です。
}
@ary は空です。

ほしい結果はこんな感じです。
擬似番号 名前
 1   山田
 2   渡辺
 3   のり
....
1020  亀田

他の方法で擬似番号をつけるのはわかるのですが、変数を使っての方法がわからずです。。。
やはり、何かが間違っていると思われます。。。
3日間費やしましたが、当方はおバカ過ぎてわからず。。。

問題が解りましたら、どうか、どうか教えてくださいませ。><
何卒、宜しくお願い致します。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2009/03/19 21:39:37
  • 終了:2009/03/20 01:42:24

ベストアンサー

id:kn1967 No.2

kn1967回答回数2915ベストアンサー獲得回数3012009/03/19 23:14:47

ポイント70pt

最近使っていないので情報が多少古いかもしれませんが

DBIは複数クエリを扱う機能はまだ有していないはずなので

セミコロンで区切って複数のクエリを書いてもエラーとなり

何も返してくれないはずです。


番号振るくらいの事ならばperl側で行ったほうが楽で

効率も良いと思うのですが、どうしてもMySQL側でということであれば

ストアドプロシージャを作成して実現してはいかがでしょうか?

現在環境が無いため適当に書いておりますが、おおむね下記のような感じです。

$sth->do('CREATE PROCEDURE sample1() 
    BEGIN
      set @n=0;
      select @n := @n + 1 as rownum, name from lnk;
    END
');
$sth->do('CALL sample1(@val)');
$sth->do('SELECT @val');
while(my @ary = $sth->fetchrow){
    処理;
}

MySQL :: MySQL 5.1 リファレンスマニュアル :: 17.2.1 CREATE PROCEDUREおよびCREATE FUNCTION 構文

id:shiinaringo

説明サイトまで紹介して頂き、誠にありがとうございます。

実行に関してはこれからやってみます!

感謝です!

2009/03/20 01:40:48

その他の回答(1件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912009/03/19 22:49:46

MySQL で確認しただけで Perl で試せていないのすが、

my $sth = $dbh->prepare('SELECT @rownum := 0; SELECT @rownum := @rownum + 1 AS rownum, name FROM lnk');

でどうでしょうか。

http://oshiete1.goo.ne.jp/qa1906552.html?ans_count_asc=20

http://www.kent-web.com/perl/chap3.html

id:kn1967 No.2

kn1967回答回数2915ベストアンサー獲得回数3012009/03/19 23:14:47ここでベストアンサー

ポイント70pt

最近使っていないので情報が多少古いかもしれませんが

DBIは複数クエリを扱う機能はまだ有していないはずなので

セミコロンで区切って複数のクエリを書いてもエラーとなり

何も返してくれないはずです。


番号振るくらいの事ならばperl側で行ったほうが楽で

効率も良いと思うのですが、どうしてもMySQL側でということであれば

ストアドプロシージャを作成して実現してはいかがでしょうか?

現在環境が無いため適当に書いておりますが、おおむね下記のような感じです。

$sth->do('CREATE PROCEDURE sample1() 
    BEGIN
      set @n=0;
      select @n := @n + 1 as rownum, name from lnk;
    END
');
$sth->do('CALL sample1(@val)');
$sth->do('SELECT @val');
while(my @ary = $sth->fetchrow){
    処理;
}

MySQL :: MySQL 5.1 リファレンスマニュアル :: 17.2.1 CREATE PROCEDUREおよびCREATE FUNCTION 構文

id:shiinaringo

説明サイトまで紹介して頂き、誠にありがとうございます。

実行に関してはこれからやってみます!

感謝です!

2009/03/20 01:40:48
  • id:Mook
    SQL コマンドで実行すればできましたが、確かに PERL では複数同時にできないようです。

    ただ下記のようにわけることでできました。
    $sth = $db->prepare('SELECT @rownum := 0;');
    $sth->execute;
    $sth = $db->prepare('SELECT @rownum := @rownum + 1 AS rownum, name FROM test');
    $sth->execute;

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません