starlight rider had originally posted a question about retrieving multiple output parameters in seperate columns in a select statement which got me wondering
about a which is better kind of approach
create or replace procedure myproc (p_in in number, p1_out out number, p2_out out number, p3_out out number) as
begin
p1_out := p_in * 2;
p2_out := p_in + p_in;
p3_out := p_in + 20;
end;
create or replace function func1 (p_in number) return number as
p1_out number;
p2_out number;
p3_out number;
begin
myproc(p_in, p1_out, p2_out, p3_out);
return p1_out;
end;
create or replace function func2 (p_in number) return number as
p1_out number;
p2_out number;
p3_out number;
begin
myproc(p_in, p1_out, p2_out, p3_out);
return p2_out;
end;
create or replace function func3 (p_in number) return number as
p1_out number;
p2_out number;
p3_out number;
begin
myproc(p_in, p1_out, p2_out, p3_out);
return p3_out;
end;
select level, func1(level), func2(level), func3(level) from dual connect by level < 201;
1) does the select statement above actually call myproc 3 times for each row or are the results cached somehow so it only does it once per row?
2) if it does actually call it 3 times for each row is it a better idea to make one function and concat the three columns together somehow and then parse it
out for each column or have 3 seperate function calls as I have above.
create or replace function func4 (p_in number) return varchar2 as
p1_out number;
p2_out number;
p3_out number;
begin
myproc(p_in, p1_out, p2_out, p3_out);
return p1_out||',' ||p2_out||','||p3_out;
end;