在 jOOQ 中尝试使用带有 chr(10) 参数的 listagg 函数作为分隔符时,解析器遇到错误,无法解析 SQL 查询。收到的错误消息是:
String literal expected [*] chr(10)
。此问题会阻止成功解析使用以换行符作为分隔符的 listagg 的 SQL 查询。
复制者:
public class ListaggReproducer {
public static void main(String[] args) {
// JDBC connection parameters
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String username = "TEST";
String password = "TEST";
// SQL query with listagg and chr(10) delimiter
String sql = "SELECT listagg(emp_name, chr(10)) WITHIN GROUP (ORDER BY column_name) AS result FROM employe";
try (Connection conn = DriverManager.getConnection(url, username, password);
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery()) {
// Fetch and print the result
while (rs.next()) {
String result = rs.getString("result");
System.out.println(result);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
预期行为: jOOQ 应该成功解析包含 listagg 函数并以 chr(10) 参数作为分隔符的 SQL 查询,从而正确生成和执行 SQL 语句。
实际行为: 源数据库方言是 Oracle,目标数据库方言是 PostgreSQL。 两个数据库都可以完美解析 chr(10) ,但 jOOQ 解析器无法识别它。
环境:
jOOQ版本:3.19.6
数据库方言:从 Oracle 到 PostgreSQL
jOOQ版本:开源
有关此事的任何指导或解决方案将不胜感激。谢谢你。
您可以在此处报告功能请求:https://github.com/jOOQ/jOOQ/issues/new/choose
作为解决方法,您可以使用正则表达式修补输入 SQL(例如将
chr(10)
替换为 '\n'
(\n
是实际的换行符),或者使用 ParseListener
扩展解析器,这使得替换