如何在SQL :: Parser中获取包含所有保留字的列表?

时间:2009-12-27 19:00:40

标签: sql perl

#!/usr/bin/perl
use warnings;
use strict;
use 5.010;
use SQL::Parser;                                 

my $parser = SQL::Parser->new( 'ANSI', {RaiseError=>1} );

my $word = 'BETWEEN';

my $success = $parser->feature( 'reserved_words', $word );
$success = $success ? '' : 'NOT';
say "$word is $success a reserved word";

我可以检查单词是否为保留字。

是否有一个函数可以为我提供所有保留字的列表?

3 个答案:

答案 0 :(得分:7)

SQL::Dialects::ANSI是一个简单的接口,用于获取有关INI格式的ANSI SQL的信息。所以你得到它并解析它...除了它不是INI格式,因为它不包含key = value而只包含key扼杀Config::INI。唉,这是我能找到的少数可以处理字符串的INI解析器之一。

所以你可能需要手工解析它。这就是SQL :: Parser所做的。

或者,您可以从SQL :: Parser的内容中提取列表。

use Data::Dumper;
use SQL::Parser;

my $s = SQL::Parser->new;
print Dumper $s->{opts}{reserved_words};

这是一个黑客,最终会失败。

根据我上面的评论,ANSI SQL保留字列表(嘿,哪个版本的ANSI SQL?)不是确定的。数据库本身可以保留其他单词。不同的版本可能会保留不同的单词。如果你能找到一种方法来做你正在做的事情而不依赖于保留字的列表,那就去做吧。

答案 1 :(得分:2)

迈克尔通过RT给我这个页面。

SQL :: Parser的方法如何返回给定类的所有特征(例如'features($)'),类似于feature()?这对你有帮助吗?如果是,请在CPAN上针对SQL :: Statement打开功能请求。

我不会在没有充分理由的情况下打破别人依赖的工作界面 - 缺少功能不是一个好理由。

答案 2 :(得分:1)

如果您不想以编程方式使用它,请忽略我刚才所说的关于SQL :: Dialects和read the standard的所有内容。始终检查标准,因为衍生作品可能不完整,不正确或使用方言。尽管有更新的ANSI SQL标准,但大多数数据库使用SQL-92SQL:1999元素的某些变异。在那之后他们变得很傻。

我找不到SQL:1999标准的副本,但here's a BNF看起来非常彻底。