Предлагается обсудить такую штуку.
Сделать способ получения внутри процедуры списка полей, которые из нее
запросили.
Для чего: да чтоб в процедуре видеть, что некая выходная переменная нне нужна
вызвавшему, и соответвенно ее не вычислять.
Пример
есть процедура
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