sql >> Databáze >  >> RDS >> Oracle

Chyba v uložené proceduře Oracle je příliš malá vyrovnávací paměť znakového řetězce

Jednoduchá ukázka scénáře zmíněného v komentářích:

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

Pokud to zavolám proměnnou, která je deklarována dostatečně velká, je to v pořádku. Mám 12znakovou proměnnou, takže přiřazení 12znakové hodnoty není problém:

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

anonymous block completed

Ale pokud udělám chybu a udělám proměnnou volajícího příliš malou, dostanu chybu, kterou vidíte:

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:

Zásobník chyb zobrazuje řádek v proceduře, která se vyskytla (řádek 3), a řádek volajícího, který ji spustil (řádek 4). V závislosti na tom, kde to voláte, nemusíte mít samozřejmě celý zásobník.

Zmínil jste, že v budoucnu se budou objevovat různé chybové zprávy. Musíte se ujistit, že cokoli, co to někdy volá, definuje proměnné tak, aby byly dostatečně velké, aby se vyrovnaly s jakoukoli vaší zprávou. Pokud by byly uloženy v tabulce, mohli byste to poloautomatizovat, jinak to bude ruční kontrola kontroly kódu.

OK, viděl jsem váš komentář v c# po odeslání tohoto příspěvku. Vypadá to, že voláte tento konstruktor ; to neříká, jakou výchozí velikost získá, ale není nerozumné si myslet, že by to mohlo být 1. Takže musíte zavolat tento konstruktor místo toho explicitně specifikovat velikost:

... něco jako:

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

Pokud neexistuje způsob, jak obnovit velikost po vytvoření, což nevidím. (Ne něco, co jsem kdy použil!).




  1. Oprava:„přední přesnost intervalu je příliš malá“ v databázi Oracle

  2. Jak funguje sp_describe_first_result_set na serveru SQL Server

  3. Objednávka Vybrat na základě výsledků připojení (Řadit konverzace podle poslední odeslané zprávy)

  4. Získání souřadnic typu bodu MySQL