ORA-06502: 字符串缓冲区太小。即使字符串大小低于声明的大小限制

新手上路,请多包涵
 FOR this_loop
     IN (SELECT field_A, field_B
           FROM TABLE_NAME
          WHERE    num = i_num)
  LOOP
     IF this_loop.field_B BETWEEN 1 AND 3
     THEN
        v_A :=  v_A || ' ' || this_loop.field_A;
     ELSIF this_loop.field_B BETWEEN 4 AND 8
     THEN
        v_field_A := v_field_A || ' ' || this_loop.field_A;  -- Error is at this line
     ELSIF this_loop.field_B BETWEEN 9 AND 15
     THEN
        v_B :=  v_B || ' ' || this_loop.field_A;
     END IF;
  END LOOP;

变量标为

v_field_A            VARCHAR2 (100);

我知道的 -

  1. 变量 v_field_A 不能保存超过 100 个字符的值
  2. 我从 SELECT 查询得到的输出不超过 10 个字符。

我的问题 - 当字符在 varchar2 的限制范围内时,怎么可能面对这个空间缓冲区问题?几年前我遇到过这个问题,但上次原因是 select 查询的输出。它有超过 100 个字符,因此存在大小问题,但这次不超过 10 个字符。我很困惑。任何帮助表示赞赏

原文由 Pirate X 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

变量 v_field_A 不能保存超过 100 个字符的值

为什么不?这是很有可能的,因为您要 连接 CURSOR FOR LOOP 中每一行的变量。

例如,

 SQL> DECLARE
  2    v_name VARCHAR2(50);
  3  BEGIN
  4    FOR i IN
  5    (SELECT ename FROM emp
  6    )
  7    LOOP
  8      v_name := v_name || i.ename;
  9    END LOOP;
 10  END;
 11  /
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 8

使用 DBMS_OUTPUT 查看变量的当前大小和附加的新值。

让我们调试

SQL> DECLARE
  2    v_name VARCHAR2(50);
  3  BEGIN
  4    FOR i IN
  5    (SELECT ename FROM emp
  6    )
  7    LOOP
  8      dbms_output.put_line('Length of new value = '||LENGTH(i.ename));
  9      v_name := v_name || i.ename;
 10      dbms_output.put_line('Length of variable = '||LENGTH(v_name));
 11    END LOOP;
 12  END;
 13  /
Length of new value = 5
Length of variable = 5
Length of new value = 5
Length of variable = 10
Length of new value = 4
Length of variable = 14
Length of new value = 5
Length of variable = 19
Length of new value = 6
Length of variable = 25
Length of new value = 5
Length of variable = 30
Length of new value = 5
Length of variable = 35
Length of new value = 5
Length of variable = 40
Length of new value = 4
Length of variable = 44
Length of new value = 6
Length of variable = 50
Length of new value = 5

错误

DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 9

很明显,我们想将长度为 5 的字符串连接到声明为最大大小的变量 50 ,当前的大小为 50 。因此,它会抛出错误 ORA-06502: PL/SQL: numeric or value error: character string buffer too small

原文由 Lalit Kumar B 发布,翻译遵循 CC BY-SA 3.0 许可协议

您的问题的答案在于循环执行多少次以及它进入 IF 条件的次数。

例子 :

条件: 48 之间

this_loop.field_A:= ‘测试’;

循环执行次数 = 100

由于 CONCATINATION ,大小肯定会超过 100 个字符。

与其他 LOOP 条件类似的情况。

解决方案:尝试使用 CLOB 而不是 VARCHAR 来消除此问题。

Oracle 错误非常具有描述性。如果它抛出一些错误,它几乎可以解释这个场景:P。

原文由 Avrajit Roy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进