On May 7, 4:37=A0pm, "stephen O'D" <stephen.odonn...@[EMAIL PROTECTED]
> wrote:
> On May 7, 5:28 pm, Mark D Powell <Mark.Pow...@[EMAIL PROTECTED]
> wrote:
>
>
>
>
>
> > On May 7, 4:07 am, Robert Klemme <shortcut...@[EMAIL PROTECTED]
> wrote:
>
> > > On May 7, 6:51 am, m...@[EMAIL PROTECTED]
wrote:
>
> > > > This is what I'm doing now... is there a better way?
> > > > It would be great if there were some construct such
> > > > as 'for i in x begin ... end;'
>
> > > > =A0 =A0 i :=3D x.first;
> > > > =A0 =A0 loop
> > > > =A0 =A0 =A0 =A0 dbms_output.put_line(i);
> > > > =A0 =A0 =A0 =A0 exit when i =3D x.last;
> > > > =A0 =A0 =A0 =A0 i :=3D x.next(i);
> > > > =A0 =A0 end loop;
>
> > > > Many TIA!
> > > > Mark
>
> > > This will break for empty collections. =A0You can do
>
> > > SQL> set serverout on
> > > SQL> DECLARE =A0TYPE population_type IS TABLE OF NUMBER INDEX BY
> > > VARCHAR2(64);
> > > =A0 2 =A0 =A0continent_population population_type;
> > > =A0 3 =A0 =A0which VARCHAR2(64);
> > > =A0 4 =A0BEGIN
> > > =A0 5 =A0 =A0dbms_output.put_line('-----------');
> > > =A0 6
> > > =A0 7 =A0 =A0which :=3D continent_population.FIRST;
> > > =A0 8 =A0 =A0while which is not null loop
> > > =A0 9 =A0 =A0 =A0dbms_output.put_line(which || ' -> ' ||
> > > continent_population(which));
> > > =A010 =A0 =A0 =A0which :=3D continent_population.NEXT(which);
> > > =A011 =A0 =A0end loop;
> > > =A012
> > > =A013 =A0 =A0dbms_output.put_line('-----------');
> > > =A014
> > > =A015 =A0 =A0continent_population('Australia') :=3D 30000000;
> > > =A016 =A0 =A0continent_population('Antarctica') :=3D 1000; --
Creates =
new
> > > entry
> > > =A017 =A0 =A0continent_population('Antarctica') :=3D 1001; --
Replaces=
> > > previous value
> > > =A018
> > > =A019 =A0 =A0which :=3D continent_population.FIRST;
> > > =A020 =A0 =A0while which is not null loop
> > > =A021 =A0 =A0 =A0dbms_output.put_line(which || ' -> ' ||
> > > continent_population(which));
> > > =A022 =A0 =A0 =A0which :=3D continent_population.NEXT(which);
> > > =A023 =A0 =A0end loop;
> > > =A024
> > > =A025 =A0 =A0dbms_output.put_line('-----------');
> > > =A026 =A0END;
> > > =A027 =A0/
> > > -----------
> > > -----------
> > > Antarctica -> 1001
> > > Australia -> 30000000
> > > -----------
>
> > > PL/SQL procedure successfully completed.
>
> > > SQL>
>
> > > Cheers
>
> > > robert
>
> > >
seehttp://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/coll=
ec......
>
> > I think I would consider the For I in 1..n construct
>
> > UT1 > l
> > =A0 1 =A0declare
> > =A0 2 =A0type t_array is table of varchar2(10) index by
binary_integer;
> > =A0 3 =A0t_list =A0 t_array;
> > =A0 4 =A0begin
> > =A0 5 =A0t_list(1) :=3D 'one';
> > =A0 6 =A0t_list(2) :=3D 'two';
> > =A0 7 =A0t_list(3) :=3D 'three';
> > =A0 8 =A0t_list(4) :=3D 'four';
> > =A0 9 =A0t_list(5) :=3D 'five';
> > =A010 =A0for I in 1..t_list.last loop
> > =A011 =A0 =A0dbms_output.put_line(t_list(I));
> > =A012 =A0end loop;
> > =A013* end;
> > UT1 > /
> > one
> > two
> > three
> > four
> > five
>
> > PL/SQL procedure successfully completed.
>
> > Again as Robert warned in his solution the array should not be empty.
>
> > HTH -- Mark D Powell --
>
> I am fairly sure if you do
>
> for i in 1 .. v_array.count loop
> =A0 null;
> end loop;
>
> It will happily handle an empty array (don't have access to Oracle
> right now to check).- Hide quoted text -
>
> - Show quoted text -
Your are probably correct. My quick test failed however using
table.count instead of table.last like I did would probably be a
better idea and would be worth testing. It has been over 3 years
since I wrote any PL/SQL code worth mentioning. After posting I
though I should have tested table.first .. table.last also. Maybe
tomorrow I will find some spare time.
-- Mark D Powell --


|