После некоторого обострения я обнаружил нечетное поведение (IMO), когда функция вызывает другую. Если внешняя функция создает временную таблицу, а внутренняя функция создает временную таблицу с тем же именем, внутренняя функция «выигрывает». Это предназначено? FWIW, я владею SQL Server, и временные таблицы не действуют таким образом. Временные таблицы (#temp
или @temp
) привязаны к функции. Таким образом, эквивалентная функция (хранимая процедура SQL Server) вернет «7890», а не «1234».PostgreSQL (9.4) временная область таблицы
drop function if exists inner_function();
drop function if exists outer_function();
create function inner_function()
returns integer
as
$$
begin
drop table if exists tempTable;
create temporary table tempTable (
inner_id int
);
insert into tempTable (inner_id) values (1234);
return 56;
end;
$$
language plpgsql;
create function outer_function()
returns table (
return_id integer
)
as
$$
declare intReturn integer;
begin
drop table if exists tempTable; -- note that inner_function() also declares tempTable
create temporary table tempTable (
outer_id integer
);
insert into tempTable (outer_id) values (7890);
intReturn = inner_function(); -- the inner_function() function recreates tempTable
return query
select * from tempTable; -- returns "1234", not "7890" like I expected
end;
$$
language plpgsql;
select * from outer_function(); -- returns "1234", not "7890" like I expected
Но в чем вопрос? –