开发者问题收集

即使关闭该设置,jOOQ 也会用引号括起函数

2020-02-17
154

我在设置中关闭了添加引号的功能:

.withRenderQuotedNames(RenderQuotedNames.NEVER)

但是当我检查 SQL 日志时,仍然在输出中发现双引号。jOOQ 将其添加到函数调用中:

select connect_by_isleaf LEAF, ms.MODULNAME, ms.MODULNAMESPRUNG, 
       TOSCA.PA_BEZ."MODULTOSCA_MENUBEZ"(ms.MODULNAMESPRUNG, 
       TOSCA.PA_BASIS."SPRACHE_USER"()) MENUBEZ, app.BEZKURZ 
       from TOSCA.MODULSPRUNG ms 
       join TOSCA.MODULTOSCA mt1 on (ms.MODULNAME = mt1.MODULNAME and mt1.MODULART = 'M') 
       left outer join TOSCA.MODULTOSCA mt2 on mt2.MODULNAME = ms.MODULNAMESPRUNG 
       left outer join TOSCA.APPLIKATION app on app.APPL = mt2.APPL 
       start with ms.MODULNAME = 'X000' 
       connect by (prior ms.MODULNAMESPRUNG = ms.MODULNAME and prior ms.FUNKTION = 'springen') 
       order siblings by ms.SEQUENZ

以及过程调用:

begin ? := TOSCA.PA_SPRACH."MSGALERT_TEXT" (P_MODULNAME => 'ALLE', P_LAUFNR => 0); end;

这是一个错误吗?还是我必须配置其他东西?

1个回答

最近报告了一个相关错误。可能是 3.12 回归: https://github.com/jOOQ/jOOQ/issues/9813 。我们目前正在调查此事。

一种解决方法是实现 ExecuteListener 并使用正则表达式将所有函数标识符 \."(\w+)"\( 替换为 .$1( :

class WorkaroundFor9813 extends DefaultExecuteListener {
    static final Pattern P = Pattern.compile("\\.\"(\\w+)\"\\(");
    @Override
    public void renderEnd(ExecuteContext ctx) {
        ctx.sql(P.matcher(ctx.sql()).replaceAll(".$1("));
    }
}

当然,这是一种解决方法,它可能会意外匹配不应该匹配的内容……

Lukas Eder
2020-02-17