2

バックエンドに mySQL データベースを使用して、Perl の SQL::Statement::Functions で定義された UDF を操作しようとしています。http://metacpan.org/pod/SQL::Statement::Functions#User-Defined-Functionsに記載されているように、私は本でそれをプレイしていますが、四角形を離れる前に、CREATE FUNCTION のエラーステートメントは醜い頭をもたげています。最初のコードは次のとおりです ($dbh は与えられたものであり、正常に動作します。これは、私が使用しているフレームワークのより大きな構造の一部にすぎないため、質問をすべてスパムにしたくありませんfoo()。 22 または "_PK FROM location" による SELECT はすべて問題なく、Data::Dumper のクエリに対応する 22 または値を取得するため、接続は問題ありません):

use Data::Dumper;
use SQL::Statement::Functions;

sub foo {
    return 999;
}

#$dbh is defined elsewhere
$dbh->do("CREATE FUNCTION foo") or die "error creating function foo(); " . $dbh->errstr;

my $sth = $dbh->prepare("SELECT foo(22)") or die "error preparing query: " . $dbh->errstr;
$sth->execute or die "error executing query: " . $sth->errstr;

my $row = $sth->fetchrow_arrayref();
print "ROW " . Dumper($row);

エラー メッセージは次のようerror creating function foo(); You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1になり$dbh->do("CREATE...")ます。

私は CREATE FUNCTION 部分を可能な限り低くしようとしましたが、マニュアルで提案されているように...foo EXTERNALとも試しました。...foo EXTERNAL NAME foo一体、私は関数のパッケージを作成しましたが、役に立ちませんでした。

ここで私が間違っていることはありますか?

私がチェックしたところ、データベースに接続しているユーザーは、alter_routine_priv と create_routine_priv を含むすべての権限を持っています (それが SQL::Statement で使用されている場合)。

4

1 に答える 1

1

モジュールを意図したとおりに使用していません。これは、DBD が SQL 構文と関数を実装するために使用する SQL::Parser モジュールの拡張です。ドキュメントには次のように記載されています。

このモジュールには、SQL::Parser および SQL::Statement の組み込み関数が含まれています。すべての関数は、これらのモジュールをサブクラス化する任意の DBD でも使用できます (例: DBD::CSV、DBD::DBM、DBD::File、DBD::AnyData、DBD::Excel など)。

私には、それは mysql とは何の関係もないように思えます。DBD::mysql は、実際の mysql データベースのラッパーとして使用されます。接続、クエリの転送、準備などを行うだけです。ただし、それらは解析されません。これは、Oracle または MSSQL データベースに接続する場合と同様に、データベースが行っていることです。そのような場合、ドライバーは API ラッパーのようなものです。

一方、DBD::CSV と上記の他のものは、SQL 自体を解析しています。DBD::CSV は CSV ファイルを開き、SQL を理解し、(非常に簡単に説明すると) Perl コードに変換して CSV データ内のものを探します。他の人も同じです。彼らは SQL::Parser を使用して SQL を理解します。SQL::Statement::Functions は、SQL に相当する Perl 関数を提供するモジュールのようです。

SQL::Statement/SQL::Parser を直接使用して SQL を解析する場合 ...

于 2013-08-19T17:48:57.133 に答える