选择查询中的 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 的测试值在所有情况下都是 1SEQ 的测试值是 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:缺少右括号

PL/Sql 查询执行错误

PL/SQL 存储过程错误

ORACLE PL/SQL:使用多个参数调用存储过程函数(DML 查询)

pl/sql 块中的子选择上的 Oracle 8i 动态 SQL 错误