ORA-06502: - Numerische oder Wert-Fehler, die auf sehr einfache string-Funktion, was bedeutet das?
Hier ist der code... das ist nicht der vollständige code. Ich getrimmt Sie es nach unten, wo der erste Fehler aufgetreten ist:
FUNCTION get (
p_sql_o OUT VARCHAR2
) RETURN VARCHAR2 AS
str_sql VARCHAR2(4000);
BEGIN
str_sql := ' SELECT * FROM ( SELECT A.*, ROWNUM RNUM FROM ( ' ||
' SELECT item_code, ' ||
' item_desc, ' ||
' monitor, ' ||
' measured, ' ||
' inventory, ' ||
' (measured - inventory) adj_amount, ' ||
' (inventory_cost * measured) measured_cost, ' ||
'inventory';
RETURN str_sql;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END get;
Offensichtlich, das SQL ist unvollständig, aber ich es nicht verwende. Ich bin einfach der Rückgabe der SQL-string, aber ich bekomme immer noch eine Fehlermeldung:
ORA-06502: PL/SQL: numerische oder Wert Fehler: character string buffer too small
ORA-06512: in Zeile 6
Dies ist unverständlich. Hat jemand eine Ahnung, warum dies der Fall sein würde?
Sind Sie immer der Fehler innerhalb der
Was ist der Wert von p_sql_o ?
Ich kann laufen diese ohne Fehler... also ja, etwas seltsam. Sie sind nirgendwo in der Nähe der 4k-Grenze, so dass selbst wenn Sie ausgeführt wurden, diese in eine UTF-16-DB die Anzahl der bytes, die würde nicht erreichen 4k. Ich vermute, Sie versuchen, die Ausgabe in eine variable, die zu klein sind. Wie nennst du das?
Wenn ich die Beseitigung der letzten "Inventur" - Zeile in den string, es gibt keinen Fehler. Fehler tritt auf, bevor ich sogar auf die RÜCKKEHR.
get
Funktion? Oder sind Sie immer die Fehler bei dem Anrufer auf der Linie, wo die get
Funktion aufgerufen wird? Wenn letzteres, würde das bedeuten, dass der Anrufer noch nicht zugeteilt, eine genügend große Zeichenkette für die Funktion, um die Daten zurückzugeben. Außerdem ist es sehr seltsam, dass Sie eine OUT
parameter in der Funktion, die, vom Namen, scheint verwendet werden, um wieder eine SQL-Anweisung an den Aufrufer zusätzlich zu den RETURN
- Anweisung. Die OUT
parameter ist hier völlig überflüssig.Was ist der Wert von p_sql_o ?
Ich kann laufen diese ohne Fehler... also ja, etwas seltsam. Sie sind nirgendwo in der Nähe der 4k-Grenze, so dass selbst wenn Sie ausgeführt wurden, diese in eine UTF-16-DB die Anzahl der bytes, die würde nicht erreichen 4k. Ich vermute, Sie versuchen, die Ausgabe in eine variable, die zu klein sind. Wie nennst du das?
Wenn ich die Beseitigung der letzten "Inventur" - Zeile in den string, es gibt keinen Fehler. Fehler tritt auf, bevor ich sogar auf die RÜCKKEHR.
InformationsquelleAutor jlrolin | 2013-02-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da haben Sie gesagt, Sie sind nicht versuchen zu dynamisch ausführen des SQL-Sie erstellen, die syntax und die Richtigkeit von dem, was es ist, oder die Länge von dem, was es zurückgeben kann, ist klar irrelevant. Sie sind nicht etwas zu tun mit Ihrem
p_sql_o
OUT
parameter, so dass nicht dieses problem verursacht. Nur wirklich Blätterstr_sql
als Täter, und als Justin stillschweigend gestern, es ist deklariert als groß genug, innerhalb der Funktion und die Funktion selbst zusammenstellt OK - so wie es aussieht hat es zu sein, wie es genannt wird, das ist das problem.Erwähnten Sie, es funktioniert, wenn Sie entfernen die "Inventur", die reduziert die Länge des string von 201 192 Zeichen, so dass ich vermute, du hast diesen Satz auf 200 chars in den Aufrufer, so etwas wie:
Beachten Sie, dass die Nummer der Zeile, dies ist die Berichterstattung ist
5
, nicht6
als Sie hatte; es ist die Zeile in der Anrufer das ist der Fehler, nicht die Linie die Zuordnung geschieht in der Funktion. Wenn ich esstr_sql varchar2(250);
in der Anrufer-Erklärung, dann funktioniert es (aber es könnte genauso gut sein4000
entsprechend der Deklaration der Funktion).Aber
p_sql_o
wird noch leer sein, da Sie niemals. Es sieht aus wie dieOUT
parameter redundant ist. Vielleicht haben Sie gedacht, um die SQL-Zeichenfolge in, statt, und das ist bereits erklärt groß genug, in der Anrufer; aber es ist nicht klar, was der Rückgabewert wäre - Sie wahrscheinlich wollen einfach nur, um die zu entfernenOUT
parameter vollständig und stellen Sie sicher, dass die variable im Aufrufer, setzen Sie den Rückgabewert in ist groß genug.InformationsquelleAutor Alex Poole
Haben Sie versucht, läuft gerade die SQL-Skript für die DB-außerhalb der SP? Dies wird helfen, festzustellen, ob die sql-syntax korrekt ist und dass Sie das zurück, was erwartet wird. Es sieht aus wie Sie erwarten, eine Antwort zu bekommen, ist 4000 bytes oder kleiner. Sind Sie sicher, dass das ist, was zurückgegeben wird? Ich sehe nicht, Wo Klausel. Vielleicht sind Sie wieder, die mehrere Zeilen, die über Ihr limit? Zugegeben, ich bin nicht so vertraut mit gespeicherten Prozeduren, also könnte ich aus.
InformationsquelleAutor jason
Hier sind Sie mit p_sql_o als out-parameter und nicht die Zuordnung beliebiger Wert innerhalb Ihrer Funktion.
So p_sql_o wird, halten Sie den Wert, den es hatte vorher im code folgt nach dem Aufruf von Zeile dieser Funktion.
Wie Sie definiert str_sql kann halt nur 4000 char, wenn Ihr verkettete Zeichenfolge ist jenseits dieser Grenze wird es geben Charakter zeichenfolgenpuffer zu klein ORA-06512 Fehler.
Wenn Sie die Verkettung der Zeichenfolge zu erstellen, die eine select-Anweisung überprüfen, ob Sie mit den einfachen Anführungszeichen korrekt oder Sie fehlen Sie überhaupt. Wenn dies geschieht dann während der Ausführung die dynamische select-Anweisung können Sie diese Fehlermeldung erhalten ORA-06502: PL/SQL: numerische oder Wert-Fehler:
InformationsquelleAutor Sagar