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

你有一些选择。首先是通过发出特殊的 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来编写 SQL::Dialects::Oracle 文件,然后使用$sqlParser->dialect('Oracle'). 不幸的是get_config,您要继承的关键方法只返回一个大字符串,因此添加它会很笨拙。幸运的是,您可以使用get_config_as_hash它来为您做到这一点。不幸的是,我不知道如何指定一个函数。:(

由于我在解决这个问题时遇到了很多麻烦,所以我将其报告为 bug。我还报告了一个错误,这意味着$sqlParser->dialect($dialect)什么都不做,你必须编写my $sqlParser = SQL::Parser->new($dialect).

于 2013-06-17T19:32:45.920 回答