我正在使用虚拟过程使用teiid公开REST API。在我的虚拟过程中,我使用execute immediate执行SQL查询,该查询将来自虚拟过程的输入参数作为过滤器传递给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语句中如果我选择一个额外的列,这会产生解析错误)这只在我使用execute immediate执行查询时发生
答案 0 :(得分:0)
您使用的是什么版本或Teiid?什么是你的解析异常?
如果是由于截断,那么您需要使用9.1或更高版本,这允许更长的评估sql字符串 - https://issues.jboss.org/browse/TEIID-4376