Demo sederhana dari skenario yang disebutkan dalam komentar:
create or replace procedure p42(out_message out varchar2) as
begin
out_message := 'Test message';
end p42;
/
Jika saya menyebutnya dengan variabel yang dideklarasikan cukup besar, tidak apa-apa. Saya memiliki variabel 12-char, jadi menetapkan nilai 12-char tidak menjadi masalah:
declare
msg varchar2(12);
begin
p42(msg);
end;
/
anonymous block completed
Tetapi jika saya membuat kesalahan dan membuat variabel pemanggil terlalu kecil, saya mendapatkan kesalahan yang Anda lihat:
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:
Tumpukan kesalahan menunjukkan baris dalam prosedur yang membuat kesalahan (baris 3), dan baris di pemanggil yang memicunya (baris 4). Tergantung di mana Anda menyebutnya, Anda mungkin tidak memiliki seluruh tumpukan, tentu saja.
Anda menyebutkan bahwa akan ada berbagai pesan kesalahan di masa mendatang. Anda perlu memastikan bahwa apa pun yang pernah memanggil ini mendefinisikan variabel menjadi cukup besar untuk mengatasi salah satu pesan Anda. Jika disimpan dalam tabel, Anda dapat mengotomatiskannya secara semi-otomatis, jika tidak, ini akan menjadi pemeriksaan tinjauan kode manual.
Oke, lihat komentar c# Anda setelah memposting ini. Sepertinya Anda memanggil konstruktor ini ; itu tidak mengatakan berapa ukuran default yang didapat, tetapi tidak masuk akal untuk berpikir itu mungkin 1. Jadi, Anda perlu memanggil konstruktor ini sebagai gantinya untuk menentukan ukuran secara eksplisit:
... sesuatu seperti:
OracleParameter prm15 = new OracleParameter("out_str_message",
OracleDbType.Varchar2, 80);
Kecuali ada cara untuk mengatur ulang ukuran setelah pembuatan, yang tidak dapat saya lihat. (Bukan sesuatu yang pernah saya gunakan!).