Oracle
 sql >> база данни >  >> RDS >> Oracle

Грешка в буфера на символния низ е твърде малък в съхранената процедура на Oracle

Проста демонстрация на сценария, споменат в коментарите:

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

Ако извикам това с променлива, която е декларирана достатъчно голяма, всичко е наред. Имам променлива от 12 символа, така че присвояването на стойност от 12 символа не е проблем:

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

anonymous block completed

Но ако направя грешка и направя променливата на повикващия твърде малка, получавам грешката, която виждате:

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:

Стекът за грешки показва както реда в процедурата, който е довел до грешка (ред 3), така и реда в повикващия, който я е задействал (ред 4). В зависимост от това къде го извиквате, може да нямате целия стек, разбира се.

Споменахте, че в бъдеще ще има различни съобщения за грешки. Трябва да сте сигурни, че всичко, което някога извиква това, дефинира променливите да бъдат достатъчно големи, за да се справят с всяко от вашите съобщения. Ако бяха съхранени в таблица, бихте могли да го автоматизирате полуавтоматизирано, в противен случай това ще бъде ръчна проверка за преглед на кода.

Добре, видях вашия коментар за c# след публикуването на това. Изглежда, че извиквате този конструктор ; това не казва какъв размер по подразбиране получава, но не е неразумно да мислим, че може да е 1. Така че трябва да извикате този конструктор вместо да укажете изрично размера:

... нещо като:

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

Освен ако няма начин за нулиране на размера след създаването, което не виждам. (Не е нещо, което някога съм използвал!).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създаване на сплескана таблица/изглед на йерархично дефиниран набор от данни

  2. Как да индексирате Y/N колона в Oracle

  3. Копиране на таблица от една Oracle DB в друга чрез еднонасочен DBLink

  4. Ред за оценка на клаузата на Oracle SQL

  5. Към какво съпоставя Hibernate булев тип данни, когато се използва база данни на Oracle по подразбиране?