这是部分代码:
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);
错误提示:
Unknown function 'length' at /usr/lib/perl5/site_perl/5.8.5/SQL/Statement.pm line 88
.
如何告诉解析器“length”是一个 pl/sql 函数?或者也许还应该安装一些 pl/sql 方言文件?
最佳答案
你有一些选择。首先是extend the syntax by issuing special SQL commands告诉解析器新函数。
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);
这不能很好地扩展,因此您需要使用扩展进行子类化。不幸的是the documentation for subclassing SQL::Parser并没有说明这一点。
最后,您可以使用 SQL::Dialects::Role 编写 SQL::Dialects::Oracle 文件。或通过子类化 SQL::Dialects::ANSI然后使用 $sqlParser->dialect('Oracle')
。不幸的是关键get_config
您要子类化的方法只会返回一个大字符串,因此添加它会很麻烦。幸运的是,您可以使用 get_config_as_hash
为你做到这一点。不幸的是我不知道如何指定一个函数。 :(
由于我很难解决这个问题,我 reported it as a bug 。我也reported a bug这意味着$sqlParser->dialect($dialect)
什么都不做,你必须写 my $sqlParser = SQL::Parser->new($dialect)
.
关于sql - 未知函数 'length' 位于/usr/lib/perl5/site_perl/5.8.5/SQL/Statement.pm 第 88 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17154713/