आपको ANYTYPE
का उपयोग करने की आवश्यकता है ANYDATA
. का वर्णन करने के लिए और सुनिश्चित करें कि प्रकार सही है। फिर आप piecewise
. का उपयोग करके विशेषता तक पहुंच सकते हैं और getVarchar2
।
नीचे दिया गया अधिकांश कोड उस प्रकार की जाँच के लिए है, जिसकी आपको आवश्यकता नहीं है यदि आप प्रकार की सुरक्षा के बारे में चिंतित नहीं हैं।
मान लौटाने का कार्य:
create or replace function get_first_attribute(
p_anydata in out anydata --note the "out" - this is required for the "piecewise"
) return varchar2 is
v_typecode pls_integer;
v_anytype anytype;
begin
--Get the typecode, and the ANYTYPE
v_typecode := p_anydata.getType(v_anytype);
--Check that it's really an object
if v_typecode = dbms_types.typecode_object then
--If it is an object, find the first item
declare
v_first_attribute_typecode pls_integer;
v_aname varchar2(32767);
v_result pls_integer;
v_varchar varchar2(32767);
--Variables we don't really care about, but need for function output
v_prec pls_integer;
v_scale pls_integer;
v_len pls_integer;
v_csid pls_integer;
v_csfrm pls_integer;
v_attr_elt_type anytype;
begin
v_first_attribute_typecode := v_anytype.getAttrElemInfo(
pos => 1, --First attribute
prec => v_prec,
scale => v_scale,
len => v_len,
csid => v_csid,
csfrm => v_csfrm,
attr_elt_type => v_attr_elt_type,
aname => v_aname);
--Check typecode of attribute
if v_first_attribute_typecode = dbms_types.typecode_varchar2 then
--Now that we've verified the type, get the actual value.
p_anydata.piecewise;
v_result := p_anydata.getVarchar2(c => v_varchar);
--DEBUG: Print the attribute name, in case you're curious
--dbms_output.put_line('v_aname: '||v_aname);
return v_varchar;
else
raise_application_error(-20000, 'Unexpected 1st Attribute Typecode: '||
v_first_attribute_typecode);
end if;
end;
else
raise_application_error(-20000, 'Unexpected Typecode: '||v_typecode);
end if;
end;
/
प्रकार:
create or replace type Person_type as object (fname varchar2(10), lname varchar2(10));
create or replace type other_type as object (first_name varchar2(10), poetry clob);
टेस्ट रन:
declare
--Create records
v_type1 person_type := person_type('Ford', 'Prefect');
v_type2 other_type := other_type('Paula', 'blah blah...');
v_anydata anydata;
begin
--Convert to ANYDATA.
--Works as long as ANYDATA is an object with a varchar2 as the first attribute.
v_anydata := anydata.convertObject(v_type1);
dbms_output.put_line(get_first_attribute(v_anydata));
v_anydata := anydata.convertObject(v_type2);
dbms_output.put_line(get_first_attribute(v_anydata));
end;
/
आउटपुट:
Ford
Paula