Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zbyt mały bufor ciągu znaków w procedurze składowanej Oracle

Proste demo scenariusza wspomnianego w komentarzach:

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

Jeśli nazywam to ze zmienną, która jest zadeklarowana wystarczająco duża, to jest w porządku. Mam zmienną 12-znakową, więc przypisanie 12-znakowej wartości nie stanowi problemu:

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

anonymous block completed

Ale jeśli popełnię błąd i sprawię, że zmienna wywołującego jest za mała, otrzymuję błąd, który widzisz:

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:

Stos błędów pokazuje zarówno wiersz procedury, w której wystąpił błąd (wiersz 3), jak i wiersz wywołujący, który go wyzwolił (wiersz 4). W zależności od tego, gdzie je wywołujesz, możesz oczywiście nie mieć całego stosu.

Wspomniałeś, że w przyszłości pojawią się różne komunikaty o błędach. Musisz upewnić się, że wszystko, co kiedykolwiek to wywoła, definiuje zmienne tak, aby były wystarczająco duże, aby poradzić sobie z dowolnymi wiadomościami. Gdyby były przechowywane w tabeli, można by to częściowo zautomatyzować, w przeciwnym razie będzie to ręczne sprawdzenie kodu.

OK, widziałem Twój komentarz w C# po opublikowaniu tego. Wygląda na to, że wywołujesz ten konstruktor ; to nie mówi, jaki ma domyślny rozmiar, ale nie jest nierozsądne, aby sądzić, że może to być 1. Więc musisz zadzwonić ten konstruktor zamiast tego wyraźnie określ rozmiar:

... coś takiego:

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

Chyba że istnieje sposób na zresetowanie rozmiaru po utworzeniu, którego nie widzę. (Nie jest to coś, czego kiedykolwiek używałem!).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Próbuję uzyskać rzeczywiste dane, które powodują wyjątek

  2. Elegancki i typ Oracle Clob

  3. Wywoływanie kodu pakietu PL/SQL w programie Java

  4. Umieść wybierz wynik w zmiennej ksh

  5. TNSPING OK ale sqlplus daje ORA-12154?