【问题标题】:Parse Oracle Query using perl使用 perl 解析 Oracle 查询
【发布时间】:2012-10-19 10:05:57
【问题描述】:

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

Select deleteddate,deletedby from temptable where id = 10;

我需要打印

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

我用这个代码sn-p:

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();

虽然这会打印已删除日期,但当我在 select 子句中给出子查询时会失败:

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

你能指点我正确的方向吗?

谢谢。

【问题讨论】:

    标签: sql perl oracle parsing lexical-analysis


    【解决方案1】:

    这似乎是该软件包的限制;它似乎是一个通用解析器,而不是可以理解高级特性(如子查询)或 Oracle 特定结构(如“来自对偶”)的东西。

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

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

    如果可以的话,另一个选项是使用实际的 Oracle 数据库。你会:

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

    否则,不幸的是,SQL::Statement 模块似乎无法胜任任务......

    【讨论】:

      猜你喜欢
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 2013-12-21
      相关资源
      最近更新 更多