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



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

我查了最大 varchar2 长度(32767 字节,如果我们假设每个字符的上限为 3 个字节,即 10k 并更改字符,此查询使用 9,200(,它似乎是通过窗口中所有内容的长度来衡量的(例如,如果我删除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;

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

顺便说一句,尝试使用APEX_COLLECTION。CREATE_COLLECTION_FROM_QUERY_B(https://docs.oracle.com/en/database/oracle/application-express/20.1/aeapi/CREATE_COLLECTION_FROM_QUERY_B-Procedure-NBV.html(,它使用批量提取以获得更好的性能。

你的意思是:

"它似乎是通过窗户里所有东西的长度来衡量的">

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

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

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

最新更新