暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle ORA-01044错误

askTom 2015-09-16
435

问题描述

嗨,汤姆,

我们遇到ORA-01044错误- ORA-01044 :绑定到变量的缓冲区大小300000000超出最大值268431360

基本上,我们正在Python中构建50K记录的列表,并将该列表传递给存储过程。存储过程将接受列表并将值插入表中。

下面是存储过程的详细信息。

类型data_ Array 是表VARCHAR2(32767) PLS_INTEGER索引;

程序pkg_bulk ( p_val_list输入输出NOCOPY数据数组)

开始
IF p_val_list 是 NOT NULl
那么
1..p_val_list.Call中的FORALL
插入XYZ值p_val_list(I) ;
结束;
异常:
...
结束;

Python代码
---------

步骤1 :执行sql查询
Step2: For Each result item in the Cursor, Put the result in the L是T (ie L是T.APPEND(cursor_result) . Once the result count reaches 50K call the Stored Procedure pkg_bulk.
第三步:继续执行步骤2 ,直到数据可用。

我们在步骤2中看到错误。当我们将记录限制从50K减少到25K时,它运行正常。

我们想知道问题的根本原因- ORA-01044 :绑定到变量的缓冲区大小300000000超出了最大值268431360。

数据库有足够的PGA内存- 3GB

oracle抱怨哪个数据库参数268431360 ?

请指点一下。

谢谢,
巴拉

专家解答

将主机阵列来回传递到数据库的限制是256MB。

SQL> select 256 * 1024 * 1024 from dual;

256*1024*1024
-------------
    268435456


实际上,一旦批量绑定的大小开始一次超过(比如说) 1000行,如果您看到任何性能优势,我会非常惊讶。

尝试使用25k行、10k行、1k行进行计时测试,其中插入的总行数相同,只是增加了循环次数。

在这个网站上搜索“批量绑定”,你会发现很多例子,绑定大小甚至低至50都非常接近最佳。

希望这个能帮上忙。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论