Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Lỗi bộ đệm chuỗi ký tự quá nhỏ trong Quy trình lưu trữ của Oracle

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!).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách định dạng số dưới dạng chữ số La mã trong Oracle

  2. Cách tạo nhiệm vụ ADDM và kiểm tra báo cáo của nó

  3. 2 cách để có được số ngày trong tháng trong Oracle

  4. org.hibernate.ObjectDeletedException:đối tượng đã xóa sẽ được lưu lại theo tầng (xóa đối tượng đã xóa khỏi các liên kết)

  5. Cho phép người dùng chọn từ một bảng