sql >> Databasteknik >  >> RDS >> Oracle

För liten teckensträngsbuffert fel i Oracle Stored Procedure

Enkel demo av scenariot som nämns i kommentarerna:

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

Om jag kallar det med en variabel som deklareras tillräckligt stor är det bra. Jag har en variabel på 12 tecken, så att tilldela ett värde på 12 tecken är inget problem:

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

anonymous block completed

Men om jag gör ett misstag och gör anroparens variabel för liten får jag felet 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:

Felstacken visar både raden i proceduren som felade (rad 3) och raden i anroparen som utlöste den (rad 4). Beroende på var du kallar det kanske du inte har hela stacken, förstås.

Du nämnde att det skulle finnas olika felmeddelanden i framtiden. Du måste se till att allt som någonsin anropar detta definierar variablerna så att de är tillräckligt stora för att klara alla dina meddelanden. Om de lagrades i en tabell kan du halvautomatisera det, annars blir det en manuell kodgranskning.

OK, såg din c#-kommentar efter att ha postat detta. Det verkar som att du anropar denna konstruktor ; det säger inte vilken standardstorlek den får, men inte orimligt att tro att det kan vara 1. Så du måste ringa denna konstruktor istället för att ange storleken uttryckligen:

... något i stil med:

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

Såvida det inte finns ett sätt att återställa storleken efter skapandet, vilket jag inte kan se. (Inte något jag någonsin har använt!).




  1. Långsam fråga i Java av JDBC men inte i andra system (TOAD)

  2. Hur väljer jag kolumn(er) efter deras numeriska position i en tabell?

  3. PostgreSQL - Välj rad med sammansatt maximalt värde från 2 kolumner

  4. mysql:gruppera efter ID, få högsta prioritet per varje ID