sql >> Database >  >> RDS >> Oracle

Tekenreeksbuffer te kleine fout in Oracle Stored Procedure

Eenvoudige demo van het scenario genoemd in opmerkingen:

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

Als ik dat aanroep met een variabele die groot genoeg is verklaard, is het prima. Ik heb een variabele van 12 tekens, dus het toewijzen van een waarde van 12 tekens is geen probleem:

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

anonymous block completed

Maar als ik een fout maak en de variabele van de beller te klein maak, krijg ik de foutmelding die je ziet:

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:

De foutenstack toont zowel de regel in de procedure die een fout heeft gemaakt (regel 3) als de regel in de beller die de fout heeft geactiveerd (regel 4). Afhankelijk van waar je het noemt, heb je natuurlijk niet de hele stapel.

U zei dat er in de toekomst verschillende foutmeldingen zouden zijn. Je moet ervoor zorgen dat alles wat dit ooit noemt, de variabelen definieert om groot genoeg te zijn om al je berichten aan te kunnen. Als ze in een tabel waren opgeslagen, zou je dat gedeeltelijk kunnen automatiseren, anders wordt het een handmatige codecontrole.

OK, zag je c#-opmerking nadat je dit had gepost. Het lijkt erop dat je deze constructor aanroept; dat zegt niet welke standaardgrootte het krijgt, maar het is niet onredelijk om te denken dat het 1 is. Dus je moet deze constructor in plaats daarvan om de grootte expliciet op te geven:

... zoiets als:

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

Tenzij er een manier is om de grootte na het maken opnieuw in te stellen, wat ik niet kan zien. (Niet iets dat ik ooit heb gebruikt!).




  1. Datum ophalen uit een resultSet

  2. SQL join-subquery

  3. Oracle:rij kopiëren terwijl één veld wordt bijgewerkt

  4. Hoe kan ik indexen opnieuw opbouwen en statistieken bijwerken in MySQL innoDB?