RE: Ant: Memory based tables
- From: "Ian Cary (C)" <Ian.Cary@xxxxxxxxxxxxxxxxxxxx>
- To: <kutrovsky.oracle@xxxxxxxxx>, <palteheld@xxxxxxxx>
- Date: Tue, 19 Jul 2005 14:45:23 +0100
Perhaps the original poster was thinking of associative arrays. This is another
name for a PL/SQL based table that can be stored as a package variable and can
be used to lookup data far quicker than from disk.
e.g.
create table lookup_table
( domain_value number,
description varchar2(200))
The application needs to transform a descriptive term into its lookup value. An
OLTP function to do this would be (forgive any syntax blunders as I'm typing
this on the fly)
create or replace function lookup_val (p_desc varchar2) return number is
retval number;
begin
select domain_value
into retval
from lookup_table
where description = p_desc;
end;
I say an OLTP function because as soon as you need to call this more than once
(e.g. for an ETL process) it becomes a pretty inefficient approach. Obviously
the most efficient approach would be to use a SQL*Plus table join however lets
assume this can't be done for some reson or another. e.g. too much rework
because the function is used in several different places
The idea behind an associative array is to create a PL/SQL table in memory that
can be accessed via a function. There are two ways the PL/SQL table can be
built - either by pre-populating it with the entire lookup table when a
transaction starts or by creating it as you go by looking up new values if they
are not found in the array. I think either way has merits and the decision
probably depends on the number of rows in the lookup table and how many
distinct values need transforming. The example below populates the array as and
when a new value is hit
create or replace package lookup as
type numtab is table of number index by varchar2(200);
t_values numtab;
function domain_value (p_desc varchar2) return number;
end;
create or replace package body lookup_value as
retval number;
function domain_value(p_desc varchar2) return number is
begin
if p_desc is null then
return null;
else
return t_values(p_desc);
end if;
exception when no_data_found then
begin
select domain_value
into retval
from lookup_table
where description = p_desc;
t_values(p_desc) := retval;
return retval;
exception when no_data_found then
return null;
end;
end;
end;
Both functions are called in a similar manner
e.g. select lookup_val('Ordinary') from dual;
or select lookup.domain_value('Associative') from dual
however you will notice that for multiple calls within the same session the
second approach does far less work and is therefore more efficient.
One word of warning - it helps to know the size of the lookup table/s as this
data is stored in the PGA and might not be a good idea for very large lookup
tables :)
Hope this helps,
Cheers,
Ian
This email is only intended for the person to whom it is addressed and may
contain confidential information. If you have received this email in error,
please notify the sender and delete this email which must not be copied,
distributed or disclosed to any other person.
Unless stated otherwise, the contents of this email are personal to the writer
and do not represent the official view of Ordnance Survey. Nor can any contract
be formed on Ordnance Survey's behalf via email. We reserve the right to
monitor emails and attachments without prior notice.
Thank you for your cooperation.
Ordnance Survey
Romsey Road
Southampton SO16 4GU
Tel: 023 8079 2000
http://www.ordnancesurvey.co.uk
Other related posts: