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

Tegnstrengbuffer for lille fejl i Oracle Stored Procedure

Simpel demo af scenariet nævnt i kommentarer:

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

Hvis jeg kalder det med en variabel, der er erklæret stor nok, er det fint. Jeg har en variabel på 12 tegn, så det er ikke noget problem at tildele en værdi på 12 tegn:

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

anonymous block completed

Men hvis jeg laver en fejl og gør den kaldendes variabel for lille, får jeg den fejl, du ser:

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:

Fejlstakken viser både linjen i proceduren, der fejlede (linje 3), og linjen i kalderen, der udløste den (linje 4). Afhængigt af hvor du kalder det, har du måske ikke hele stakken, selvfølgelig.

Du nævnte, at der ville være forskellige fejlmeddelelser i fremtiden. Du skal sikre dig, at alt, der nogensinde kalder dette, definerer variablerne til at være store nok til at klare enhver af dine beskeder. Hvis de blev gemt i en tabel, kunne du semi-automatisere det, ellers vil det være en manuel kodegennemgang.

OK, så din c#-kommentar efter at have postet dette. Det ser ud til, at du ringer til denne konstruktør ; det siger ikke, hvilken standardstørrelse den får, men det er ikke urimeligt at tro, det kan være 1. Så du skal ringe til denne konstruktør i stedet for at angive størrelsen eksplicit:

... noget i stil med:

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

Medmindre der er en måde at nulstille størrelsen efter oprettelsen, som jeg ikke kan se. (Ikke noget jeg nogensinde har brugt!).




  1. PostgreSQL Upsert (On Conflict) med samme værdier i Insert og Update

  2. Automatisk forøgelse af 'id'-værdi ved indsættelse i sqlite

  3. Hvordan kan jeg beregne samlede berørte rækker, hvis der er flere DML-forespørgsler i min PLSQL-blok?

  4. Sådan får du data for hver time i MySQL