【问题标题】:PL/SQL Storage error in Select Query选择查询中的 PL/SQL 存储错误
【发布时间】: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 的测试值在所有情况下都是 1SEQ 的测试值是 1234567654322(13 位数字)。该值被插入到另一个类型为VARCHAR 的表中,长度为19。

问题是光标刚到FETCH,它就会抛出异常声明ORA-06500: PL/SQL: storage error

我知道它必须对 select 语句做一些事情,但我正在将它转换为字符串 (varchar)。为什么我遇到这个问题?

【问题讨论】:

    标签: oracle plsql cursor oracle11g


    【解决方案1】:

    您为I_BULK_LIMIT 分配了什么值?

    PLS-06500 错误通常意味着应用程序内存不足。因此,您需要查看您在程序中分配的变量。但是数组使用的内存是最有可能的罪魁祸首。如果限制当前设置为超过几千个,您应该考虑设置一个下限。

    【讨论】:

    • 我假设如果I_BULK_LIMIT 为空,它将被设置为1000。但事实并非如此。所以游标根据NULL 限制获取值。我昨天自己解决了这个问题,但感谢您的意见:)
    【解决方案2】:

    问题出在您的掩码中,oracle 为正数添加了前导空格或为负数添加了“-”,这导致生成的字符串为 20 个字符。将 FM 添加到格式中(例如:FM0999999999999999999)。这样甲骨文就会压制前导空格。

    【讨论】:

    • 它没有帮助。我仍然遇到这个错误-6500。当我获取数据时发生错误,而不是在插入时发生。
    • 我为一千条记录运行了脚本,它工作正常,内存问题怎么办?你可以只运行几条记录吗? I_BULK_LIMIT 值是多少?
    猜你喜欢
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多