2

コードの一部を次に示します。

use SQL::Statement;
my $qryParse = "select colA from tableB where length(colA)>0";
my $sqlParser = SQL::Parser->new();
$sqlParser->dialect('ANSI');
my $stmt = SQL::Statement->new($qryParse,$sqlParser);

エラーは言う:

/usr/lib/perl5/site_perl/5.8.5/SQL/Statement.pm 行 88 の不明な関数「長さ」

.

「長さ」がpl/sql関数であることをパーサーに伝えるにはどうすればよいですか? それとも、いくつかの pl/sql 方言ファイルもインストールする必要があるのでしょうか?

4

1 に答える 1

2

いくつかのオプションがあります。1 つ目は、特別な SQL コマンドを発行して構文を拡張し、新しい関数についてパーサーに通知することです。

my $extend_sql = "CREATE FUNCTION LENGTH";
my $sql = "select colA from tableB where length(colA)>0";

my $sqlParser = SQL::Parser->new();
$sqlParser->dialect('ANSI');

my $query = join ", ", $extend_sql, $sql;
my $stmt = SQL::Statement->new($query, $sqlParser);

これはうまくスケーリングできないため、拡張機能をサブクラス化する必要があります。残念ながら、SQL::Parser のサブクラス化に関するドキュメントでは、これについてあまり詳しく説明されていません。

最後に、SQL::Dialects::Roleを使用するか、 SQL::Dialects::ANSIをサブクラス化して$sqlParser->dialect('Oracle'). 残念ながら、get_configサブクラス化する重要なメソッドは大きな文字列を返すだけなので、それに追加すると扱いにくくなります。幸いなことget_config_as_hashに、それを行うために使用できます。残念ながら、関数を指定する方法がわかりません。:(

これを理解するのに非常に苦労したので、バグとして報告しました。また、何もしないことを意味するバグも報告しました。$sqlParser->dialect($dialect)my $sqlParser = SQL::Parser->new($dialect)

于 2013-06-17T19:32:45.920 に答える