Ich habe den ganzen Tag damit verbracht, bestehende StackOverflow Fragen und Antworten zu diesem Thema zu sehen, aber bisher hat noch nichts funktioniert.ORA-06502 numerische oder vlaue error building string für clob
Ich denke, mein Problem ist etwas anders als alle anderen.
Ich baue eine JSON-Zeichenfolge basierend auf einer SELECT
aus der Datenbank. Dies muss in der Lage sein, 50k + Datensätze zu verarbeiten. Ich verwende 11g, aber es wird auch auf 10g bereitgestellt werden.
Ich verwende eine CLOB
, um diese Return-JSON-Zeichenfolge zu speichern, da es eine Kapazität von 4 GB hat. Allerdings bekomme ich immer den Fehler: ORA-06502: PL/SQL: numeric or value error
. Zuvor bekam ich diesen Fehler, wenn ich eine varchar
an meine clob
anfügte, zum Beispiel returnString := returnString || "some text;
, also glaube ich, dass es den Clob zu einem Varchar umgewandelt hat und dies verursachte. Seitdem habe ich von überall losgeworden denke ich, ein gegossenes auftreten könnte, durch dbms_log.append()
Hier verwendet, ist meine PL/SQL:
declare
v_person_code ca_mips_queue.person_code%type;
v_person_type ca_mips_queue.person_type%type;
cursor cur_mips is
select person_code,person_type from ca_mips_queue
where terminal_code = :terminal_code and (download_stage='1' or download_stage = '2');
returnString clob;
v_isFirst boolean := TRUE;
begin
dbms_lob.createtemporary(returnString, true);
dbms_lob.open(returnString, DBMS_LOB.LOB_READWRITE);
dbms_lob.append(returnString, '{"items":[');
for person_rec in cur_mips
loop
v_person_code := person_rec.person_code;
v_person_type := person_rec.person_type;
update ca_mips_queue
set download_stage = '2'
where terminal_code = :terminal_code
and person_code = v_person_code
and person_type = v_person_type;
if v_isFirst then
dbms_lob.append(returnString, '{"person_code": "');
v_isFirst := FALSE;
else
dbms_lob.append(returnString, ',{"person_code": "');
end if;
dbms_lob.append(returnString, v_person_code);
dbms_lob.append(returnString, '", "person_type": "');
dbms_lob.append(returnString, v_person_type);
dbms_lob.append(returnString, '"}');
dbms_output.put_line(length(returnString));
end loop;
commit;
dbms_lob.append(returnString, ']}');
:result := returnString;
dbms_lob.close(returnString);
:status_code := 200;
exception
when others then
:status_code := 500;
:exception := SQLERRM;
DBMS_OUTPUT.PUT_LINE(:exception);
end;
Hinweis Ich drucke die Größe returnString
auf jeder aus Schleife dbms_output.put_line(length(returnString));
Hier verwendet, ist der Ausgang (oder die letzte) davon: (450kb)
43933
43976
44019
44062
44105
44148
44191
44234
44277
44320
44363
44406
44449
44492
44535
44578
44621
44664
44707
44750
44793
44836
44879
44922
44965
45008
ORA-06502: PL/SQL: numeric or value error
So sieht es aus wie sein auf rund 45.008 Bytes in Schwierigkeiten zu geraten.
Wie kann das sein, wenn ein clob
ein Limit von 4 GB hat?
Vielleicht ist das Problem 'Länge()'. Das erfordert ein Zeichenargument und keinen CLOB. Versuchen Sie 'dbms_lob.getlength()'. –
Wie ist die 'bind'-Ergebnisvariable definiert? Es kann hilfreich sein, die 'when anderen' vorübergehend zu entfernen, damit Sie den vollständigen Fehler-Stack sehen können, einschließlich der Zeilennummer, die den Fehler verursacht. Oder re-raise es, oder benutze die Fehler-Formatierungs-Tools ... Ich schätze, dass die Variable zu klein ist, aber es wäre hilfreich zu sehen, ob diese Aufgabe fehlschlägt. –
Nein, es ist nicht 'length()'. Das gibt es nur für das Debuggen. Wenn ich es entferne, bekomme ich den gleichen Fehler. – eoinzy