我最近在使用jOOQ解析包含Oracle DUAL表的SQL查询时遇到了一个解析问题. 下面是查询的简化版本,它再现了问题:
private Pair<String, String> getPerEchDate(Connection dbConn) throws Exception {
String query="select 'dtPrEch' as lib , to_char(add_months(sysdate,12),'dd/mm/yyyy') as val from dual tab";
Pair<String, String> rtn =null;
try (final PreparedStatement pStmt = dbConn.prepareStatement(query); ResultSet rs= pStmt.executeQuery()) {
while(rs.next()){
rtn= Pair.of(rs.getString(1), rs.getString(2));
}
return rtn;
} catch (SQLException | ParserException e1) {
throw new Exception(e1);
}
}
jOOQ Settings:
private Settings createSettings() {
Settings settings = new Settings()
.withParseDialect(SQLDialect.ORACLE)
.withParseUnknownFunctions(ParseUnknownFunctions.IGNORE)
.withTransformTableListsToAnsiJoin(true) // transform (+) to left outer join
.withTransformUnneededArithmeticExpressions(TransformUnneededArithmeticExpressions.ALWAYS)
.withTransformRownum(Transformation.ALWAYS)
.withParamType(ParamType.INLINED)
.withParamCastMode(ParamCastMode.DEFAULT)
.withRenderOptionalAsKeywordForFieldAliases(RenderOptionalKeyword.ON)
.withRenderOptionalAsKeywordForTableAliases(RenderOptionalKeyword.ON)
.withRenderQuotedNames(RenderQuotedNames.EXPLICIT_DEFAULT_UNQUOTED)
.withRenderNameCase(RenderNameCase.UPPER)
// Oracle reads empty strings as NULLs, while PostgreSQL treats them as empty.
// Concatenating NULL values with non-NULL characters results in that character in Oracle, but NULL in PostgreSQL.
// So this parameter whenever there's a concat it applies coalesce(x ,'')
.withRenderCoalesceToEmptyStringInConcat(true);
return settings;
}
为了提供更多的上下文,以下是我使用的相关jOOQ设置:
-
Database Configuration:
Database source dialect: Oracle
Destination dialect: PostgreSQL - jOOQ version:3.19.6.
- jOOQ edition:开源
有趣的是,当忽略DUAL表的别名时,查询工作得非常好.但是,一旦一个别名,如tab添加到DUAL,解析失败,导致错误relation "dual" does not exist
.
我期望jOOQ能够成功地解析查询(Oracle方言)并生成相应的jOOQ表示(PostgreSQL).但是,我遇到了一个与DUAL表别名相关的解析错误.我试着调整查询并删除别名,在这些情况下,jOOQ能够毫无问题地解析查询.
我正在寻求关于为什么jOOQ难以用别名解析DUAL以及如何解决或解决这个问题的建议或见解.任何帮助、解决方案或建议将不胜感激.谢谢