我正在一个项目中,我们将大量]](超过12000个)视图从Oracle迁移到Hadoop / Impala。我编写了一个小的Java实用程序来从Oracle提取视图DDL,并希望使用ANTLR4遍历AST并生成与Impala兼容的视图DDL语句。
大多数工作是相对简单的,仅涉及将一些Oracle特定的语法古怪改写为Impala样式。但是,我面临一个问题,即我不确定我是否有最好的答案:我们有许多特殊情况,其中日期字段中的值是在多个嵌套函数调用中提取的。例如,以下内容从“日期”字段中提取日期:
TO_NUMBER(TO_CHAR(d.R_DATE , 'DD' ))
我为Oracle SQL声明了ANTLR4语法,因此在到达
TO_NUMBER
和TO_CHAR
时也获得了访问者回调,但是我想对此特殊情况进行特殊处理。
除了为外部函数实现处理程序方法,然后采用手动遍历嵌套结构以查看方法之外,没有其他方法>
我在生成的Visitor类中有类似的东西:
@Override public String visitNumber_function(PlSqlParser.Number_functionContext ctx) { // FIXME: seems to be dodgy code, can it be improved? String functionName = ctx.name.getText(); if (functionName.equalsIgnoreCase("TO_NUMBER")) { final int childCount = ctx.getChildCount(); if (childCount == 4) { final int functionNameIndex = 0; final int openRoundBracketIndex = 1; final int encapsulatedValueIndex = 2; final int closeRoundBracketIndex = 3; ParseTree encapsulated = ctx.getChild(encapsulatedValueIndex); if (encapsulated instanceof TerminalNode) { throw new IllegalStateException("TerminalNode is found at: " + encapsulatedValueIndex); } String customDateConversionOrNullOnOtherType = customDateConversionFromToNumberAndNestedToChar(encapsulated); if (customDateConversionOrNullOnOtherType != null) { // the child node contained our expected child element, so return the converted value return customDateConversionOrNullOnOtherType; } // otherwise the child was something unexpected, signalled by null // so simply fall-back to the default handler } } // some other numeric function, default handling return super.visitNumber_function(ctx); } private String customDateConversionFromToNumberAndNestedToChar(ParseTree parseTree) { // ... }
我正在一个项目中,我们将大量(超过12000个)视图从Oracle迁移到Hadoop / Impala。我写了一个小的Java实用程序来从Oracle中提取视图DDL,并希望...
对于遇到相同问题的任何人,解决方法似乎是:
更改语法定义并引入自定义子类型嵌套函数的封装表达式。