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

Pir*_*e X 4 sql oracle plsql oracle11g

 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;
Run Code Online (Sandbox Code Playgroud)

变量声明为

v_field_A            VARCHAR2 (100);
Run Code Online (Sandbox Code Playgroud)

我知道的 -

  1. 变量v_field_A的值不能超过100个字符
  2. 我从SELECT查询中获得的输出没有超过10个字符。

我的问题-当字符受到varchar2的限制时,如何甚至可能面对这个空间缓冲区问题?我几年前就遇到过这个问题,但是上一次原因是select查询的输出。它有超过100个字符,因此出现了大小问题,但是这次不超过10个字符。我糊涂了。任何帮助表示赞赏

Lal*_*r B 5

变量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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

错误

DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 9
Run Code Online (Sandbox Code Playgroud)

很明显,我们想将一个长度5为字符串的字符串连接到声明为max size的变量上,该变量50当前具有size的值50。因此,它将引发错误ORA-06502: PL/SQL: numeric or value error: character string buffer too small