characterfolgenpuffer zu kleiner Fehler in Oracle Stored Procedure

Ich erhalte einen Fehler in einer Oracle 11g gespeicherten Prozedur. Der Fehler ist …

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

Es geschieht in Zeile 31, die Zeile enthält out_cnt_tot := 0; Ich bin mir wirklich nicht sicher, warum mit dieser Linie etwas nicht stimmt. Ein anderer Programmierer hat diese Prozedur erstellt, und ich bin mit SQL-Prozeduren wirklich nicht vertraut. Kann mir jemand helfen, das herauszufinden?

 create or replace PROCEDURE "FIP_BANKREC_PREP" ( in_file_date in varchar2, in_bank_code in varchar2, out_cnt_apx_miss_no out integer, out_cnt_prx_miss_no out integer, out_cnt_apx_no_mtch out integer, out_cnt_prx_no_mtch out integer, out_cnt_ap_dup out integer, out_cnt_pr_dup out integer, out_cnt_bad out integer, out_cnt_ap_load out integer, out_cnt_pr_load out integer, out_cnt_ap_not_load out integer, out_cnt_pr_not_load out integer, out_cnt_tot out integer, out_message out varchar2 ) as file_date date; ap_acct_no varchar2(16); pr_acct_no varchar2(16); -- ------------------------------------------------------ -- begin logic -- ------------------------------------------------------ begin file_date := to_date(in_file_date,'yyyymmdd'); out_cnt_tot := 0; --- THE ERROR IS ON THIS LINE --- out_message := 'Test Message'; select brec_acct_code into ap_acct_no from MSSU.zwkfi_bankrec_accts where brec_acct_bank = in_bank_code and brec_acct_type = 'AP'; select brec_acct_code into pr_acct_no from MSSU.zwkfi_bankrec_accts where brec_acct_bank = in_bank_code and brec_acct_type = 'PR'; // The rest of the procedure... 

Solutions Collecting From Web of "characterfolgenpuffer zu kleiner Fehler in Oracle Stored Procedure"

Einfache Demo des in den Kommentaren genannten Szenarios:

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

Wenn ich das mit einer variables anrufe, die groß genug ist, ist es in Ordnung. Ich habe eine Variable mit 12 character, daher ist das Zuweisen eines 12-character-Werts kein Problem:

 declare msg varchar2(12); begin p42(msg); end; / anonymous block completed 

Aber wenn ich einen Fehler mache und die Variable des Aufrufers zu klein mache, bekomme ich den Fehler, den du siehst:

 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 Fehler-Stack zeigt sowohl die Zeile in der errorshaften Prozedur (Zeile 3) als auch die Zeile in dem Aufrufer, der sie ausgetriggers hat (Zeile 4). Je nachdem, wo du anrufst, hast du natürlich nicht den ganzen Stapel.

Sie haben erwähnt, dass es in Zukunft verschiedene Fehlermeldungen geben wird. Sie müssen sicherstellen, dass alles, was Sie dies nennt, die variables so definiert, dass sie groß genug sind, um mit Ihren Nachrichten fertig zu werden. Wenn sie in einer Tabelle gespeichert würden, könnten Sie das halbautomatisch automatisieren, ansonsten wäre es eine Überprüfung des manuellen Codes.


OK, habe deinen c # Kommentar nach der Veröffentlichung gesehen. Es sieht so aus, als würdest du diesen Konstruktor aufrufen; das sagt nicht, welche Standardgröße es bekommt, aber nicht unvernünftig zu denken, dass es 1 sein könnte. Also müssen Sie diesen Konstruktor stattdessen aufrufen, um die Größe explizit anzugeben:

OracleParameter (characterfolge, OracleType, Int32)
Initialisiert eine neue Instanz der OracleParameter-class, die den Parameternamen, den datatyp und die Länge verwendet.

… 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, die ich nicht sehen kann. (Nicht etwas, das ich jemals benutzt habe!).