टिप्पणियों में उल्लिखित परिदृश्य का सरल डेमो:
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)। आप इसे कहां कॉल कर रहे हैं, इस पर निर्भर करते हुए, निश्चित रूप से आपके पास पूरा स्टैक नहीं हो सकता है।
आपने उल्लेख किया कि भविष्य में विभिन्न त्रुटि संदेश होंगे। आपको यह सुनिश्चित करने की ज़रूरत है कि जो कुछ भी इसे कॉल करता है वह चर को आपके किसी भी संदेश से निपटने के लिए पर्याप्त रूप से परिभाषित करता है। यदि उन्हें किसी तालिका में संग्रहीत किया गया था, तो आप उसे अर्ध-स्वचालित कर सकते हैं, अन्यथा यह एक मैन्युअल कोड समीक्षा जांच होगी।
ठीक है, इसे पोस्ट करने के बाद आपकी सी # टिप्पणी देखी। ऐसा लगता है कि आप इस कंस्ट्रक्टर को कॉल कर रहे हैं; यह यह नहीं बताता कि इसे कौन सा डिफ़ॉल्ट आकार मिलता है, लेकिन यह सोचना अनुचित नहीं है कि यह 1 हो सकता है। इसलिए आपको यह कंस्ट्रक्टर इसके बजाय स्पष्ट रूप से आकार निर्दिष्ट करने के लिए:
... कुछ इस तरह:
OracleParameter prm15 = new OracleParameter("out_str_message",
OracleDbType.Varchar2, 80);
जब तक निर्माण के बाद आकार को रीसेट करने का कोई तरीका न हो, जिसे मैं नहीं देख सकता। (ऐसा कुछ नहीं जो मैंने कभी इस्तेमाल किया हो!)।