Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Zeichenkettenpuffer zu klein Fehler in Oracle Stored Procedure

Einfache Demo des in den Kommentaren erwähnten Szenarios:

create or replace procedure p42(out_message out varchar2) as
begin
  out_message := 'Test message';
end p42;
/

Wenn ich das mit einer Variablen aufrufe, die groß genug deklariert ist, ist es in Ordnung. Ich habe eine 12-Zeichen-Variable, also ist die Zuweisung eines 12-Zeichen-Werts kein Problem:

declare
  msg varchar2(12);
begin
  p42(msg);
end;
/

anonymous block completed

Aber wenn ich einen Fehler mache und die Variable des Anrufers zu klein mache, bekomme ich den Fehler, den Sie sehen:

declare
  msg varchar2(10);
begin
  p42(msg);
end;
/

Error report:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "STACKOVERFLOW.P42", line 3
ORA-06512: at line 4
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    
*Action:

Der Fehlerstapel zeigt sowohl die Zeile in der Prozedur, die einen Fehler verursacht hat (Zeile 3), als auch die Zeile im Aufrufer, die ihn ausgelöst hat (Zeile 4). Je nachdem, wo Sie es aufrufen, haben Sie natürlich möglicherweise nicht den gesamten Stack.

Sie haben erwähnt, dass es in Zukunft verschiedene Fehlermeldungen geben wird. Sie müssen sicherstellen, dass alles, was dies jemals aufruft, die Variablen so definiert, dass sie groß genug sind, um mit jeder Ihrer Nachrichten fertig zu werden. Wenn sie in einer Tabelle gespeichert wären, könnten Sie das halbautomatisieren, andernfalls wäre es eine manuelle Überprüfung des Codes.

OK, ich habe Ihren C#-Kommentar gesehen, nachdem ich dies gepostet habe. Anscheinend rufen Sie diesen Konstruktor auf; das sagt nicht aus, welche Standardgröße es bekommt, aber es ist nicht unvernünftig zu glauben, dass es 1 sein könnte. Sie müssen also dieser Konstruktor stattdessen die Größe explizit angeben:

... etwas wie:

OracleParameter prm15 = new OracleParameter("out_str_message",
    OracleDbType.Varchar2, 80);

Es sei denn, es gibt eine Möglichkeit, die Größe nach der Erstellung zurückzusetzen, was ich nicht sehen kann. (Nichts, was ich jemals benutzt habe!).