【发布时间】:2018-06-30 00:20:35
【问题描述】:
我是使用 PL/SQL 的新手(虽然我之前有一些 SQL 经验)。我一直在尝试将特定数据转换为 JSON。我在整个互联网上进行了研究,但我无法弄清楚我的代码出了什么问题。它确实产生了诸如“ORA-12801”之类的错误。这实际上是我正在处理的一个大型数据集。我只想使用游标循环,因为它比使用其他库更容易使用。因此,您可以在查看代码后提供意见或想法吗? **更新:我将 Toad for Oracle 用于数据。 **UPDATE2:我已经查看了其他链接,但这并没有解决我的问题,因为我不希望使用其他库,例如 PL/JSON。相反,我想在 PL/SQL 中使用简单的游标语句将表的列仅转换为 JSON。
DECLARE
links varchar2(750);
CURSOR statement
IS
SELECT DISTINCT NAME, GROUP
FROM ST.PEOPLE
GROUP BY ST.PEOPLE.NAME, ST.PEOPLE.GROUP
ORDER BY ST.PEOPLE.NAME ASC;
BEGIN
FOR line IN statement
LOOP
links := '{"source":"'|| line.NAME ||'", "target":"'|| line.GROUP||'""}';
END LOOP;
dbms_output.put_line(links);
END;
失败:
ORA-12801: error signaled in parallel query server P045
ORA-12853: insufficient memory for PX buffers: current 16352K, max needed 702720K
ORA-04031: unable to allocate 65560 bytes of shared memory (“large pool”, “unknown object”, “large pool”, “PX msg pool”)
ORA-06512: at line 17
【问题讨论】:
-
该查询在命令行上单独运行时是否会出现相同的错误?我能想到的只是
PEOPLE表定义了某种程度的并行性,因此一个普通的游标会给出一个PX 错误,并且它有太多的数据来执行这两个键上的DISTINCT/ORDER BY。它包含多少行?你真的需要所有这些吗?代码是否适用于较少的行数? -
不,我没有尝试在 cmd 行上运行查询。该表有大量行。目前,我正在尝试仅从“名称”和“组”列加载值。截至目前,该代码实际上是原始代码的修改版本。原始代码有更多关于 3 的列。
-
我认为这个问题与 JSON 或 PL/SQL 没有太大关系,因为该错误似乎仅与游标有关,而不是任何特定于 JSON 的处理。可能您可以将问题更改为“使用 ORDER BY 的大型 GROUP BY 失败并出现 ORA-12853:PX 缓冲区内存不足”之类的问题,并仅显示查询。
-
搜索
ORA-12853,建议好像是alter table people noparallel或者减少parallel_max_servers参数设置。例如stackoverflow.com/q/36478807/230471
标签: json database loops plsql database-cursor