Предлагается обсудить такую штуку.
Сделать способ получения внутри процедуры списка полей, которые из нее 
запросили.
Для чего: да чтоб в процедуре видеть, что некая выходная переменная нне нужна 
вызвавшему, и соответвенно ее не вычислять.
Пример
есть процедура
CREATE PROCEDURE NEW_PROCEDURE
returns (
   p1 integer,
   p2 integer,
   p3 integer)
as
begin
  for select p1 from table1 into :p1 do
 begin
   select count(*) from table2 where table2.f=:p1 into :p2;
   select count(*) from table3 where table3.f=:p1 into :p3;
   suspend;
 end
end;

вызов:
  select p1,p2,p3 from new_procedure;
вызов по другому
  select p1,p2 from new_procedure;

в обоих вариантах вычисляется значение p3 которое во втором случае не нужно 
никому.

Можно подумать, что это можно возложить на сервер, что он сам додумывался, но 
так ненадо.
Сейчас можно сделать с помощью дополнительного параметра

CREATE PROCEDURE NEW_PROCEDURE
returns (
   p1 integer,
   p2 integer,
   p3 integer,
   p_list:varchar(20))
as
begin
  for select p1 from table1 into :p1 do
 begin
   if (str_pos('~p2~', p_list)>0) then
     select count(*) from table2 where table2.f=:p1 into :p2;
   if (str_pos('~p3~', p_list)>0) then
     select count(*) from table3 where table3.f=:p1 into :p3;
   suspend;
 end
end;

так вот, предложение состоит в том, чтобы не делать параметр p_list, а всегда 
иметь внутри процедуры структуру или переменную имеющую аналогичную p_list 
функциональность.
Т.е. например

CREATE PROCEDURE NEW_PROCEDURE
returns (
   p1 integer,
   p2 integer,
   p3 integer,
)
as
begin
  for select p1 from table1 into :p1 do
 begin
   if (output.p2) then
     select count(*) from table2 where table2.f=:p1 into :p2;
   if (output.p3) then
     select count(*) from table3 where table3.f=:p1 into :p3;
   suspend;
 end
end;


в чем достоинства: ненадо изменять количество входных параметров, ненадо где-то 
формировать p_list, ненадо вызывать функцию pos, механизм универсальный.



--
С уважением
Кочмин Александр
Firebird Foundation associate member #257

Ответить