how to define PL/SQL tables?

one book i read says that we can take advantage of
cacheing with pl/sql tables to increase performance.

one example is:

cursor product_csr(cp_product_id number)
is
select normal_value from products where
product_id=cp_product_id;

l_product_normal_value products.normal_value%type;

begin
l_product_normal_value:=
product_val_table(p_product_id);
exception
when no_data_found then
open product_csr(p_product_id);
fetch product_csr into l_product_normal_value;
close product_csr;
product_val_table(p_product_id):=
l_product_normal_value;
end;

but it didn't give me the definition of product_val_table.
can somebody tell me by some example?