6

Perl から MySQL ストアド プロシージャを呼び出すにはどうすればよいですか? ストアド プロシージャ機能は MySQL にとってかなり新しいものであり、Perl 用の MySQL モジュールはまだ追いついていないようです。

4

5 に答える 5

7

データセットを生成するMySQLストアドプロシージャでは、Perl DBD ::mysql4.001以降を使用する必要があります。(http://www.perlmonks.org/?node_id=609098

以下は、新しいバージョンで動作するテストプログラムです。

mysql> delimiter //
mysql> create procedure Foo(x int)
  -> begin
  ->   select x*2;
  -> end
  -> //

perl -e 'use DBI; DBI->connect("dbi:mysql:database=bonk", "root", "")->prepare("call Foo(?)")->execute(21)'

ただし、DBD :: mysqlのバージョンが古すぎる場合は、次のような結果が得られます。

DBD::mysql::st execute failed: PROCEDURE bonk.Foo can't return a result set in the given context at -e line 1.

CPANを使用して最新のDBDをインストールできます。

于 2008-09-15T17:01:51.913 に答える
5

DBD::mysql docs の複数の結果セットに関するセクションに例があります。

于 2008-09-15T16:27:46.223 に答える
3
#!/usr/bin/perl
# Stored Proc - Multiple Values In, Multiple Out
use strict;
use Data::Dumper;
use DBI;
my $dbh = DBI->connect('DBI:mysql:RTPC;host=db.server.com',
    'user','password',{ RaiseError => 1 }) || die "$!\n";
my $sth = $dbh->prepare('CALL storedProcedure(?,?,?,?,@a,@b);');
$sth->bind_param(1, 2);
$sth->bind_param(2, 1003);
$sth->bind_param(3, 5000);
$sth->bind_param(4, 100);
$sth->execute();
my $response = $sth->fetchrow_hashref();
print Dumper $response . "\n";

理解するのに少し時間がかかりましたが、上記で必要なものを取得できました。複数のリターン「行」を取得する必要がある場合は、ただ...

while(my $response = $sth->fetchrow_hashref()) {
    print Dumper $response . "\n";
}

お役に立てば幸いです。

于 2012-05-02T00:35:37.380 に答える
2

まず第一に、おそらく DBI ライブラリを介して接続し、次にバインド変数を使用する必要があります。例:

#!/usr/bin/perl
#
use strict;
use DBI qw(:sql_types);

my $dbh = DBI->connect(
            $ConnStr,
            $User,
            $Password,
            {RaiseError => 1, AutoCommit => 0}
          ) || die "Database connection not made: $DBI::errstr";
my $sql = qq {CALL someProcedure(1);}    } 

my $sth = $dbh->prepare($sql);
eval {
  $sth->bind_param(1, $argument, SQL_VARCHAR);
};
if ($@) {
 warn "Database error: $DBI::errstr\n";
 $dbh->rollback(); #just die if rollback is failing
}

$dbh->commit();

私はこれをテストしていないことに注意してください.CPANで正確な構文を調べる必要があります.

于 2008-09-15T16:09:15.037 に答える
1

こんにちは、上記と同様ですが、SQL exec を使用しています。CALL コマンドが機能しませんでした。角かっこ内にあるものはすべて入力し、角かっこを削除する必要があります。

   DBI を使用します。
   #START: データベースのセットアップと接続
   my $host = '*[サーバー]*\\*[データベース]*';
   私の $database = '*[テーブル]*';
   私の $user = '*[ユーザー]*';
   my $auth = '*[パスワード]*';

   my $dsn = "dbi:ODBC:Driver={SQL Server};Server=$host;Database=$database";
   my $dbh = DBI->connect($dsn, $user, $auth, { RaiseError => 1 });

   #END : データベースのセットアップと接続
   $sql = "exec *[ストアド プロシージャ名]* *[param1]*,*[param2]*,*[param3]*;";
   $sth = $dbh->prepare($sql);
   $sth->execute or die "SQL エラー: $DBI::errstr\n";
于 2015-03-24T15:59:40.233 に答える