使用perl解析Oracle Query

时间:2012-10-30 04:36:28

标签: sql perl oracle parsing lexical-analysis

我必须对oracle查询执行词法分析,并将查询分成perl中的各个部分(基于子句)。例如,考虑一下:

Select deleteddate,deletedby from temptable where id = 10;

我需要打印

select : deleteddate , deletedby
from : temptable
where : id = 10

我使用了这段代码:

my $parser= SQL::Statement->new();
$parser->{PrinteError}=1;
my $query = SQL::Statement->new("select deleteddate,deletedby from temptable where id =10",$parser);

my @columns = $query->columns();

print $columns[0]->name();

虽然这打印了deleteddate,但是当我在select子句中给出子查询时,这会失败:

Select deleteddate,deletedby,(select 1+1 from dual) from temptable where id = 10;

请指点我正确的方向。

感谢。

1 个答案:

答案 0 :(得分:2)

它似乎是该套餐的限制;它似乎是一个通用的解析器,而不是可以理解子查询或Oracle特定结构(如“from dual”)等高级功能的东西。

您的系统有哪些限制?如果python是一个选项,它看起来像是一个功能更全面的库:

http://code.google.com/p/python-sqlparse/

另一种选择是使用实际的Oracle数据库,如果这是一个选项。你会:

  • 使用DBI和DBD :: Oracle模块创建与Oracle&的连接;获取数据库句柄,
  • 使用您的查询
  • 在数据库句柄上调用prepare()来创建语句句柄
  • 执行查询(Oracle中可能有一个选项在“仅测试”或“仅解析”模式下执行),
  • 检查语句句柄(例如NAMES_hash属性)以获取列名。

否则,似乎SQL :: Statement模块似乎不适合任务......