Bản demo đơn giản của kịch bản được đề cập trong phần bình luận:
create or replace procedure p42(out_message out varchar2) as
begin
out_message := 'Test message';
end p42;
/
Nếu tôi gọi điều đó với một biến được khai báo đủ lớn, thì không sao cả. Tôi có một biến 12 ký tự, vì vậy việc gán giá trị 12 ký tự không phải là vấn đề:
declare
msg varchar2(12);
begin
p42(msg);
end;
/
anonymous block completed
Nhưng nếu tôi mắc lỗi và đặt biến người gọi quá nhỏ, tôi sẽ gặp lỗi như bạn đang thấy:
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:
Ngăn xếp lỗi hiển thị cả dòng trong quy trình bị lỗi (dòng 3) và dòng trong trình gọi đã kích hoạt nó (dòng 4). Tất nhiên, tùy thuộc vào nơi bạn đang gọi nó, bạn có thể không có toàn bộ ngăn xếp.
Bạn đã đề cập rằng sẽ có nhiều thông báo lỗi khác nhau trong tương lai. Bạn cần đảm bảo rằng bất kỳ thứ gì từng gọi điều này xác định các biến đủ lớn để đối phó với bất kỳ thông báo nào của bạn. Nếu chúng được lưu trữ trong một bảng, bạn có thể bán tự động hóa điều đó, nếu không, đó sẽ là kiểm tra xem xét mã thủ công.
OK, đã thấy bình luận c # của bạn sau khi đăng bài này. Có vẻ như bạn đang gọi hàm tạo này ; điều đó không cho biết kích thước mặc định mà nó nhận được, nhưng không phải là không hợp lý khi nghĩ rằng nó có thể là 1. Vì vậy, bạn cần gọi hàm tạo này thay vào đó để chỉ định kích thước một cách rõ ràng:
... một cái gì đó như:
OracleParameter prm15 = new OracleParameter("out_str_message",
OracleDbType.Varchar2, 80);
Trừ khi có cách đặt lại kích thước sau khi tạo mà tôi không thấy. (Không phải thứ tôi đã từng sử dụng!).