选择查询中的 PL/SQL 存储错误
Posted
技术标签:
【中文标题】选择查询中的 PL/SQL 存储错误【英文标题】:PL/SQL Storage error in Select Query 【发布时间】:2011-11-15 15:47:56 【问题描述】:我有以下光标定义
cMultiplier NUMBER := 100000000000000000 ;
CURSOR CR_TABLE1 IS
SELECT to_char((COL_ID * cMultiplier) + SEQ,'0999999999999999999') "NEW_COL"
FROM TABLE1;
然后这个游标被提取为
FETCH CR_TABLE1
BULK COLLECT INTO AR_TABLE1 LIMIT I_BULK_LIMIT;
EXIT WHEN AR_TABLE1.COUNT = 0;
AR_TABLE1
的类型是
TYPE T_TABLE1 IS TABLE OF CR_TABLE1%ROWTYPE;
AR_TABLE1 T_TABLE1;
COL_ID
的测试值在所有情况下都是 1
,SEQ
的测试值是 1234567654322
(13 位数字)。该值被插入到另一个类型为VARCHAR
的表中,长度为19。
问题是光标刚到FETCH
,它就会抛出异常声明ORA-06500: PL/SQL: storage error
我知道它必须对 select 语句做一些事情,但我正在将它转换为字符串 (varchar)。为什么我遇到这个问题?
【问题讨论】:
【参考方案1】:您为I_BULK_LIMIT
分配了什么值?
PLS-06500 错误通常意味着应用程序内存不足。因此,您需要查看您在程序中分配的变量。但是数组使用的内存是最有可能的罪魁祸首。如果限制当前设置为超过几千个,您应该考虑设置一个下限。
【讨论】:
我假设如果I_BULK_LIMIT
为空,它将被设置为1000
。但事实并非如此。所以游标根据NULL
限制获取值。我昨天自己解决了这个问题,但感谢您的意见:)【参考方案2】:
问题出在您的掩码中,oracle 为正数添加了前导空格或为负数添加了“-”,这导致生成的字符串为 20 个字符。将 FM 添加到格式中(例如:FM0999999999999999999
)。这样甲骨文就会压制前导空格。
【讨论】:
它没有帮助。我仍然遇到这个错误-6500
。当我获取数据时发生错误,而不是在插入时发生。
我为一千条记录运行了脚本,它工作正常,内存问题怎么办?你可以只运行几条记录吗? I_BULK_LIMIT 值是多少?以上是关于选择查询中的 PL/SQL 存储错误的主要内容,如果未能解决你的问题,请参考以下文章
ORACLE PL/SQL 在查询 3 列信息时出现存储过程错误
将 XML 数据存储在表中的 PL/SQL 过程抛出错误(23,102):PL/SQL:ORA-00907:缺少右括号