मैं उपयोगकर्ता परिभाषित ऑब्जेक्ट से निपटने के लिए एक प्रक्रिया लिख रहा हूं जो ANYDATA में संग्रहीत है। ऑब्जेक्ट प्रकार और विशेषता का नाम केवल रन टाइम पर ही जाना जा सकता है, इसलिए मैं घोषणा अनुभाग में इसके लिए viarable परिभाषित नहीं कर सकता। जावा में, मैं इसके साथ निपटने के लिए प्रतिबिंब का उपयोग कर सकता हूं, मैं कक्षा का नाम और फ़ील्ड नाम जान सकता हूं। फिर मैं प्रतिबिंब के माध्यम से खेतों तक पहुंच सकते हैं। क्या पीएलएसक्यूएल में ऐसा करने का कोई तरीका है? मेरे सिर में अभी क्या प्रक्रिया में गतिशील रूप से एक एसक्यूएल स्ट्रिंग बना रहा है और इसे निष्पादित कर रहा है। लेकिन यह वही नहीं है जो मैं चाहता हूं।प्रतिबिंब?
मान लें कि, उपयोगकर्ता ए ने एडीटी प्रकार को create or replace type Person_type as object (fname varchar2(10), lname varchar2(10));
के रूप में परिभाषित किया है और ऑब्जेक्ट इंस्टेंस बनाया है और इसे ANYDATA में डाला है।
मेरी प्रक्रिया में, किसी भी तरह से मुझे पता है कि मुझे इस ऑब्जेक्ट की पहली विशेषता से निपटने की आवश्यकता है, जो कि fname है। तो अगर पहले स्थान पर एडीटी प्रकार पता है, मेरे कोड किया जाएगा:
declare
adobject A.Person_type; -- HERE! I don't know the type yet, so I can't define adobject!
tempAnydata anydata;
rt number;
vbuffer varchar2(10);
...
begin
select somecolumn
into tempAnydata
from sometable
where something='something' for update;
rt := tempAnydata.GetObject(adobject);
vbuffer := adobject.fname; -- HERE! I don't know the attribute name is fname!
-- deal with vbuffer here
end;
तो क्या मैं यह गतिशील बनाने के लिए क्या करना चाहिए? अग्रिम में धन्यवाद।
आप जानते हैं कि 'tempAnydata' है * वास्तव में * एक' A.person_type' के रूप में आप निश्चित रूप से करते हैं (अन्यथा आप 'GetObject (adobject नहीं कर सका)' वास्तव में इस प्रकार के adobject के साथ) तो आप * यह भी जानते हैं कि उस प्रकार की पहली विशेषता क्या है। या क्या मैं कुछ न कुछ भूल रहा हूं? –
A.person_type सिर्फ एक उदाहरण है, यह किसी भी उपयोगकर्ता परिभाषित प्रकार हो सकता है। यह banymal_type या कुछ और हो सकता है। – icespace
स्टेटिक मजबूत टाइपिंग बेकार है। (गड़बड़ पुराने स्मॉलटाकर बंद हो जाता है, स्वयं को विचलित कर देता है :-) –