当前位置: 首页 > 知识库问答 >
问题:

字符串缓冲区太小ORA-06502

杨轶
2023-03-14

我在游标循环中连接varchar2数据类型时遇到了问题。

过程在循环中迭代,以生成用于批处理的插入和删除操作的in子句。该过程将对每1000个帐号批处理运行。

有没有其他方法可以做到这一点?

create or replace PROCEDURE LOAD_ITEM_DATA_TO_CONSOLIDATE(updatecount OUT NUMBER
)
IS
  cnt       NUMBER := 0;
  c_limit CONSTANT PLS_INTEGER DEFAULT 1000;
  search_id varchar2(32727);
  TYPE account_array
    IS TABLE OF VARCHAR2(255) INDEX BY BINARY_INTEGER;
  l_data    ACCOUNT_ARRAY;
  CURSOR account_cursor IS
    SELECT DISTINCT account_no AS account_num
    FROM   item_temp;
BEGIN
    OPEN account_cursor;

    LOOP
        FETCH account_cursor bulk collect INTO l_data limit c_limit;

        search_id := '''';

        FOR i IN 1 .. l_data.count LOOP
            IF( i != 1 ) THEN
              search_id := search_id
                           || ','
                           || ''''
                           || l_data(i)
                           || '''';
            ELSE
              search_id := search_id
                           || l_data(i)
                           || '''';
            END IF;
        END LOOP;

        BEGIN

        SAVEPOINT move_data_to_temp_table;

        EXECUTE IMMEDIATE 'delete from item where ACCOUNT_NO IN('||search_id||')';

        EXECUTE IMMEDIATE 'insert into item(ID,ACCOUNT_NO,ITEM_ID,ITEM_VALUE) select HIBERNATE_SEQUENCE.nextval,temp.ACCOUNT_NO,temp.ITEM_ID,temp.ITEM_VALUE from item_TEMP temp     where ACCOUNT_NO IN('||search_id||')';

        cnt := cnt + SQL%rowcount;

        COMMIT;

        EXCEPTION WHEN OTHERS THEN ROLLBACK to move_data_to_temp_table;

        END;

        EXIT WHEN account_cursor%NOTFOUND;

    END LOOP;

    updatecount := cnt;

    CLOSE account_cursor;

END LOAD_ITEM_DATA_TO_CONSOLIDATE;

共有1个答案

微生俊名
2023-03-14

这似乎有些过度设计。为什么不就这样呢?

create or replace PROCEDURE LOAD_ITEM_DATA_TO_CONSOLIDATE
    (updatecount OUT NUMBER)
IS
BEGIN
    delete from item 
    where ACCOUNT_NO IN ( SELECT account_no
                          FROM   item_temp);

   insert into item(ID,ACCOUNT_NO,ITEM_ID,ITEM_VALUE) 
   select HIBERNATE_SEQUENCE.nextval, temp.ACCOUNT_NO, temp.ITEM_ID, temp.ITEM_VALUE 
   from item_TEMP temp  ;

    updatecount := SQL%rowcount;

END LOAD_ITEM_DATA_TO_CONSOLIDATE;
 类似资料:
  • 我以不同的方式尝试了以下代码,比如去掉while或if,但是当我把它们放在一起(if和while)时,我总是在最后得到错误。。。 错误: 通过将变量“a”的声明方式更改为: *注意,这里的显著变化是使用VARCHAR2而不是CHAR(不是更大的长度)。根据@user272735的回答,这是关键。

  • 我完全震惊了,不明白我需要做什么来修复这个错误。我有一个plsql过程,它接受一个varchar2字符串和一个OUT参数,这是一个数字。你能帮我学习plsql和php吗。 member_name列类型为VARCHAR2(100),member_id为NUMBER(20) 我从php执行上述存储过程,如下所示 这是我在php中看到的输出 字符串整数警告:oci_execute()[function.

  • 我在下面的字段上得到字符串缓冲区太小的错误。 位于导致错误的select语句中。它是数据类型。

  • 我得到这样的错误:错误:ORA-06502:PL/SQL:数值或值错误:字符串缓冲区太小

  • 问题内容: 我有一个名为Memcached.Js的项目,它是Memcached服务器到Node.js的端口。 我一直在使用字符串和缓冲区进行比较,比较内存占用量和性能。对于内存,毫无疑问,缓冲区是正确的选择。 但令我惊讶的是,表演并非如此。执行字符串操作比使用缓冲区更快。这是我尝试的: 完整的代码在这里:https : //github.com/dalssoft/memcached.js/blob

  • 问题内容: 需要帮忙。有一个名为arglist的数据列表,例如:[‘dlink’,’des’,‘1210’,’c’,24] <-这就是“打印”视图。 这段代码: 它给: 怎么了? 问题答案: 当json.loads需要一个字符串时,您正在尝试加载文件对象。您可以使用 或者更好: 在第一个示例中,文件是打开的,但从未关闭(不好的做法)。在第二个示例中,上下文管理器在离开上下文块后关闭文件。