【问题标题】:Teiid execute immediate gives a parsing error when executing long queriesTeiid execute immediate 执行长查询时出现解析错误
【发布时间】:2017-12-11 08:59:54
【问题描述】:

我正在使用虚拟过程通过 teiid 公开 REST API。在我的虚拟过程中,我使用立即执行来执行 SQL 查询,该查询将来自虚拟过程的输入参数作为过滤器过滤到 where 子句(动态 where cluase)。这适用于小型选择查询,但是当查询长度超过特定长度时,它会给出解析错误。 这个问题有什么解决办法吗? 有没有其他方法可以在我的 SQL 查询中实现动态 where 子句?

假设闲置查询有大约 4000 个字符。这工作正常。

    CREATE VIRTUAL PROCEDURE GetVals(IN filters string) RETURNS (json clob) OPTIONS (UPDATECOUNT 0, "REST:METHOD" 'GET', "REST:URI" 'get_vals')
    AS

    BEGIN execute immediate 
        'SELECT  JSONOBJECT(JSONARRAY_AGG(JSONOBJECT(
            col1,
            col2,
            col3,
            col4,
            col5,
            col6,
            ....
    ....

            )) as "data" 
        ) as json FROM(
        SELECT SUM((CASE
                WHEN ((CASE
    .....
    ....
    .....   

                FROM ex_table AS ex
                  JOIN table1
                  ON ...
                 .....
              WHERE a=b AND ' ||  filters || '
          GROUP BY col)
        ) AB';            
    END

但只要我在上面的 SQL 查询中添加更多行,它就会给出解析错误登录任意行。我的查询语法没有问题。我所做的唯一更改是查询的长度向其中添加了更多行(例如,在我的 SELECT 语句中,如果我再选择一个额外的列,则会出现解析错误)只有当我使用执行立即执行查询时才会发生这种情况

【问题讨论】:

    标签: teiid redhat-datavirt


    【解决方案1】:

    您使用的是什么版本或 Teiid?你的解析异常是什么?

    如果是由于截断,那么您需要使用 9.1 或更高版本,它允许计算更长的 sql 字符串 - https://issues.jboss.org/browse/TEIID-4376

    【讨论】:

    • 我使用的是 teiid 9.3.5。上面的 SQL 代码运行良好,长度低于 4000 个字符。但是,当我向 SELECT 语句添加更多列时,超过了 4000 个字符的限制,并记录了 SQL 查询中任意行的解析错误。
    • 您需要显式转换为 clob - cast('select ...' as clob) || ...
    猜你喜欢
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2019-10-19
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    相关资源
    最近更新 更多