it-swarm.com.de

ORA-06502: Zeichenkettenpuffer zu klein. Obwohl die Zeichenfolge unter der angegebenen Größenbeschränkung liegt

 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;

Variable dekaliert als

v_field_A            VARCHAR2 (100);

Was ich weiß -

  1. Die Variable v_field_A darf nicht mehr als 100 Zeichen enthalten
  2. Die Ausgabe, die ich aus der SELECT-Abfrage bekomme, hat nicht mehr als 10 Zeichen. 

Meine Frage: Wie kann man dieses Problem mit dem Space-Puffer überhaupt bewältigen, wenn die Zeichen innerhalb der Grenzen von varchar2 liegen? Ich bin vor einigen Jahren mit diesem Problem konfrontiert, aber als letztes Mal wurde die Ursache von select query ausgegeben. Es hatte mehr als 100 Zeichen und somit das Größenproblem, diesmal jedoch nicht mehr als 10 Zeichen. Ich bin verwirrt. Jede Hilfe wird geschätzt

3
Pirate X

Die Variable v_field_A darf nicht mehr als 100 Zeichen enthalten

Warum nicht? Es ist sehr viel möglich, da Sie verketten die Variable für jede Zeile in CURSOR FOR LOOP sind. 

Zum Beispiel,

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

Verwenden Sie DBMS_OUTPUT, um die aktuelle Größe der Variablen und den neuen Wert anzuzeigen, der angehängt wird.

Lassen Sie uns debuggen

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

Error

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

Es ist ziemlich klar, wir wollten einen String mit der Länge 5 zu der als max size 50 deklarierten Variablen verketten, die aktuell einen Wert der Größe 50 enthält. Daher wirft es den Fehler ORA-06502: PL/SQL: numeric or value error: character string buffer too small.

4
Lalit Kumar B

11 Zeilen * 10 Zeichen> 100 Zeichen => Fehler - Ihr verkettet viele Zeilen zu je 10 Zeichen zu einer von drei Variablen. Einer von ihnen wird jedes Mal durch die Schleife wachsen.

Was vermisse ich?

Achten Sie auch auf Zeichen im Vergleich zu Bytes. In einem varchar2 benötigt jeder CHARACTER wahrscheinlich 2 Bytes.

0
dsz

Sie können die Zeichenfolgenverkettung in einer SQL-Abfrage ausführen:

SELECT field_A,
       LISTAGG(CASE WHEN field_B BETWEEN 1 AND 3 THEN field_A END, ' ') WITHIN GROUP (ORDER BY field_A) as val1,
       LISTAGG(CASE WHEN field_B BETWEEN 4 AND 8 THEN field_A END, ' ') WITHIN GROUP (ORDER BY field_A) as val2,
       LISTAGG(CASE WHEN field_B BETWEEN 9 AND 15 THEN field_A END, ' ') WITHIN GROUP (ORDER BY field_A) as val3
FROM TABLE_NAME
WHERE num = i_num;

Dies soll Ihren Code vereinfachen. Die Länge der Oracle-Zeichenfolge ist immer noch begrenzt. Sie können das Oracle-Limit in PL/SQL mit einem CLOB umgehen. Dies ist jedoch nicht erforderlich, wenn die letzte Zeichenfolge nur einige hundert Zeichen umfasst.

0
Gordon Linoff

Die Antwort auf Ihre Frage liegt darin, wie oft die Schleife Ausgeführt wird und wie oft sie in den IF-Zustand gerät.

BEISPIEL:

Bedingung : ZWISCHEN 4 UND 8  

this_loop.field_A: = 'test';

Anzahl, wie oft die Schleife ausgeführt wird = 100

Aufgrund vonCONCATINATIONwird die Größe definitiv mehr als 100 CHAR erreichen.

Ähnlich verhält es sich mit anderen LOOP-Bedingungen.

Lösung : Versuchen Sie die Verwendung vonCLOBanstelle vonVARCHAR, um dieses Problem zu beheben.

Oracle-Fehler sind sehr beschreibend. Wenn es einen Fehler wirft, erklärt es das Szenario ziemlich genau: P.

0
Avrajit Roy

Prüfen Sie, wie oft diese Bedingung ausgeführt wird und welche Werte verkettet werden. Da dies mehrere Male verkettet wird, besteht die Möglichkeit, dass die Größe von v_field_A 50 Zeichen überschreitet

ELSIF this_loop.field_B BETWEEN 4 AND 8
 THEN
    v_field_A := v_field_A || ' ' || this_loop.field_A; 

Um dieses Problem zu beheben, können Sie die Größe dieser Variablen erhöhen. Sie können einen varchar bis zu 32.767 Byte deklarieren

0
Dawn