Oracle
 sql >> Database >  >> RDS >> Oracle

Errore troppo piccolo nel buffer della stringa di caratteri in Oracle Stored Procedure

Semplice demo dello scenario menzionato nei commenti:

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

Se lo chiamo con una variabile dichiarata abbastanza grande, va bene. Ho una variabile di 12 caratteri, quindi assegnare un valore di 12 caratteri non è un problema:

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

anonymous block completed

Ma se faccio un errore e rendo troppo piccola la variabile del chiamante, ottengo l'errore che stai vedendo:

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:

Lo stack di errori mostra sia la riga nella procedura che ha generato l'errore (riga 3) sia la riga nel chiamante che l'ha attivato (riga 4). A seconda di dove lo stai chiamando potresti non avere l'intero stack, ovviamente.

Hai detto che ci sarebbero stati vari messaggi di errore in futuro. Devi assicurarti che qualsiasi cosa chiami questo definisca le variabili in modo che siano abbastanza grandi da far fronte a qualsiasi tuo messaggio. Se fossero archiviati in una tabella, potresti semi-automatizzarlo, altrimenti sarà un controllo di revisione manuale del codice.

OK, ho visto il tuo commento c# dopo averlo pubblicato. Sembra che tu stia chiamando questo costruttore ; questo non dice quale dimensione predefinita ottiene, ma non è irragionevole pensare che potrebbe essere 1. Quindi è necessario chiamare questo costruttore invece di specificare la dimensione in modo esplicito:

... qualcosa come:

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

A meno che non ci sia un modo per ripristinare le dimensioni dopo la creazione, cosa che non riesco a vedere. (Non qualcosa che io abbia mai usato!).