【发布时间】:2019-04-08 08:43:43
【问题描述】:
我有一个存储过程,我使用游标循环访问临时表中的项目:
OPEN CURSOR_SCORE_ITEMS FOR SELECT
ID_X, ID_Y
FROM
SCORE_ITEMS
GROUP BY
ID_X, ID_Y
HAVING
SUM(SCORE) > 10;
LOOP
FETCH CURSOR_SCORE_ITEMS BULK COLLECT INTO COMPARE_ITEMS LIMIT 100;
---loop over items and do stuff---
END LOOP;
CLOSE CURSOR_SCORE_ITEMS;
对于“SCORE_ITEMS”表较小的情况,该过程运行良好,但对于大型表(数百万行),我收到错误
“ORA-01652: Temp-Segment kann nicht um 12800 in Tablespace TEMP_ALL erweitert werden"
(对不起,它是德语)。
请注意,SCORE_ITEMS 是一个临时表,它是在该过程的前面生成的。游标查询似乎超出了临时表空间的大小。
我已经阅读了一些涉及增加表空间大小的解决方案,但我对此数据库没有任何权限,所以我认为这是不可能的。是否有替代方法或我可能考虑的某种预处理来减少临时表空间中的开销?
【问题讨论】:
-
你的临时表空间对于一个事务来说太小了,你应该在 x 行之后提交或者增加你的临时表空间的大小
-
你在循环中做了什么?有没有机会将游标和循环的逻辑封装到单个 DML 语句中?或者,至少,将大部分计算移到打开光标中?另外,为什么要使用 ref 游标,而不是“普通”(即显式或隐式)游标?
标签: sql oracle plsql tablespace