Plsql 如何将大型SQL查询的结果添加到APEX集合(PL/SQL代码编辑器字符限制问题)?

Plsql 如何将大型SQL查询的结果添加到APEX集合(PL/SQL代码编辑器字符限制问题)?,plsql,oracle-apex,Plsql,Oracle Apex,我使用APEX来显示复杂(250行)查询的结果。我想将此查询的结果放入一个集合中,但当我在PL/SQL代码编辑器中为填充集合的动态操作定义查询时,它表示该值太长(“值太长4840个字符!”) 我查找了max varchar2 length(32767字节,如果我们假设每个字符的上限为3字节,即10k和change字符,此查询使用9200),它似乎是通过窗口中所有内容的长度来度量的(例如,如果我删除DECLARE语句,则过长警告将减少7个字符) 上面的内容意味着我不能将它分解成单独的变量并将它们连

我使用APEX来显示复杂(250行)查询的结果。我想将此查询的结果放入一个集合中,但当我在PL/SQL代码编辑器中为填充集合的动态操作定义查询时,它表示该值太长(“值太长4840个字符!”)

我查找了max varchar2 length(32767字节,如果我们假设每个字符的上限为3字节,即10k和change字符,此查询使用9200),它似乎是通过窗口中所有内容的长度来度量的(例如,如果我删除
DECLARE
语句,则过长警告将减少7个字符)

上面的内容意味着我不能将它分解成单独的变量并将它们连接起来(除非它们是全局的,并且动作将它们全部执行)

如何绕过PL/SQL编辑器的这个明显限制?同样的代码在一个简单的SQL编辑器中工作得很好

DECLARE
    l_query varchar2(32767) := '--big query'
BEGIN
    IF APEX_COLLECTION.COLLECTION_EXISTS (p_collection_name => 'NEW1') THEN
            APEX_COLLECTION.DELETE_COLLECTION (p_collection_name => 'NEW1');
    end if;
    APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY (
        p_collection_name => 'NEW1', 
        p_query => l_query,
        p_generate_md5 => 'YES');
End;
你是什么意思

“它似乎是用窗户里所有东西的长度来衡量的”

PL/SQL代码最多可以包含32767个字符,这意味着从开始到结束,包括declare begin end

您没有显示的是实际查询及其大小。上面的代码似乎是有效的,所以也许你可以分享完整的代码,包括查询


一个主要的建议是将PL/SQL放入数据库中。因此,在本例中,创建一个包含所有逻辑的包过程来为您创建集合,在动态操作中,您只需调用该过程。

为什么不将查询放入视图中?在安全方面,这比将查询分配到页面项要好。至少要确保不能从浏览器设置会话状态保护限制,以避免SQL注入漏洞


顺便说一句,尝试使用APEX集合。从使用批量获取的查询B创建集合,以获得更好的性能。

您的oracle版本是什么?尝试将查询放在页面项中,并在计算或页面过程中设置值。或者,如果您的数据库版本支持is(sql宏是一个相对较新的功能),您也可以尝试使用sql宏。我在问原始问题时正在查找该版本,但(令人尴尬的)仍然无法确定它是否支持is(sql宏)——我假设它是18或19,但这是我发现的最接近的版本:Oracle Database 12c Enterprise Edition 12.2.0.1.0版和Application Express-详细信息-产品构建5.1.4.00.08版。不过,我会按照你的建议,试着把它放在一个页面项目中。再次感谢!拥有这个系统的人是。。。特指的我知道如何创建和使用视图,但对它们了解不够,无法知道它们是否能够看到视图并导致问题(我不希望这样)。谢谢你的其他建议,我会把它们放进去。我在文档中看到的是它是32767字节。这件事无关紧要,但我记得是这样的。我发现的实际限制是4150个字符——这是我在PL/SQL块或隐藏对象/静态值块(尝试上面@Koen的建议)中可以拥有的最大值。查询是有效的(在SQL块中运行良好),查询足够短的整个块也是有效的,但将它们放在一起并不起作用。我将把它放在一个包过程中(我对PL/SQL非常陌生),谢谢你的建议!