sql - 未知函数 'length' 位于/usr/lib/perl5/site_perl/5.8.5/SQL/Statement.pm 第 88 行

标签 sql perl parsing

这是部分代码:

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/

相关文章:

php - SQL 不使用的字符

SQL Server 安装/配置错误

perl - 用LDAP提取CN?

mysql - SQL LIKE REGEXP 匹配单个值和逗号字符串

php - 从MySQL数据库中显示php中的所有表名

perl - 在使用严格之前是否有理由使用警告?

regex - 我想匹配任何不包括 '#' 但包括 '\#' 的内容

MySQL 以 mm/dd/yyyy 格式加载日期

javascript - Node JS 的 SQL 外部化(XML 解析)

使用 chrome 文件系统写入时,Javascript 字符串中存在 NULL 字符