Thanks for the question, Saminathan.
Asked: December 26, 2003 - 8:12 pm UTC
Last updated: December 29, 2003 - 11:09 am UTC
Version: 8.1.7.3
Viewed 1000+ times
You Asked
Dear Tom,
</code>
http://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:1058232381458#10353825155270 <code>
I am exactly looking for this 2 dimensional array(name-value pair) feature in 8.1.7.3.
Could you please provide me the correlated_array code? I did search this site for "correlated_array" but no luck.
<Tom_Answer>
For example, once upon a time ago I wrote a simple "correlated array" type. It was an object type with some getter/setter methods, a nested table of NAME/VALUE
pairs. I could create a variable:
declare
x correlated_array := correlated_array();
begin
x.set('somename','someval');
x.set('someothername','someotherval');
dbms_output.put_line( x.get('somename') );
dbms_output.put_line( x.get('someothername') );
</Tom_Answer>
Thanks in advance,
Sami
and Tom said...
PROMPT CorrelationType
create or replace type CorrelationType as object
( name varchar2(50),
value varchar2(8192)
)
/
PROMPT CorrelationArrayType
create or replace type CorrelationArrayType as varray(255) of CorrelationType
/
PROMPT CorrelatedArray Spec
create or replace type CorrelatedArray as object
(
vals CorrelationArrayType,
member function valueof( p_name in varchar2 ) return varchar2,
pragma restrict_references(valueof,wnds,rnds),
member procedure addpair( p_name in varchar2, p_value in varchar2 ),
member procedure addHeaderline( p_line in varchar2 ),
member procedure updateValue( p_name in varchar2, p_value in varchar2 )
)
/
PROMPT CorrelatedArray Body
create or replace type body CorrelatedArray as
member procedure updateValue( p_name in varchar2, p_value in varchar2 ) is
l_found boolean := FALSE;
begin
for i in 1 .. vals.count loop
if vals(i).name = p_name then
vals(i).value := p_value;
l_found := TRUE;
exit;
end if;
end loop;
if not l_found then
addpair( p_name, p_value );
end if;
end updateValue;
member function valueof( p_name in varchar2 ) return varchar2 is
l_name varchar2(50) default upper(p_name);
l_idx number default 1;
begin
for i in 1 .. vals.count loop
exit when ( vals(i).name = l_name );
l_idx := l_idx+1;
end loop;
if ( l_idx <= vals.count ) then
return vals(l_idx).value;
else
return NULL;
end if;
end valueof;
member procedure addpair( p_name in varchar2, p_value in varchar2 ) is
begin
vals.extend;
vals( vals.count ) := CorrelationType( upper(p_name), p_value );
end addpair;
member procedure addHeaderLine( p_line in varchar2 ) is
l_n number default instr(p_line,':');
begin
addpair( ltrim(rtrim(substr( p_line, 1, l_n-1 ))),
ltrim(rtrim(substr(p_line,l_n+1))) );
end addHeaderLine;
end;
/
show error
Rating
(4 ratings)
Is this answer out of date? If it is, please let us know via a Comment