2015-09-29 5 views
0

После некоторого обострения я обнаружил нечетное поведение (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 
+0

Но в чем вопрос? –

ответ

2

Там нет никаких проблем с этим поведением, в темп таблицы PostgreSQL может иметь две области: - сессия (по умолчанию) - транзакционные

Чтобы использовать «сделки» область видимости, вы должны использовать «ON COMMIT DROP "в конце инструкции CREATE TEMP, то есть:

CREATE TEMP TABLE foo (bar INT) ON COMMIT DROP;

В любом случае ваши две функции будут выполняться в одной транзакции, поэтому, когда вы вызываете функцию inner_function из внешней_функции, вы будете в одной и той же транзакции, а PostgreSQL обнаруживает, что «tempTable» уже существует в текущем сеансе и будет отбрасывать его «inner_function» и создать снова ...

+0

Я изменил 'create временную таблицу tempTable (inner_id int),' , чтобы создать временную таблицу tempTable (inner_id int) при фиксации, ' , но она все равно возвращает« 1234 ». –

0

Это предназначение?

Да, это таблицы в базе данных, похожие на постоянные таблицы.

Они существуют в специальной схеме и автоматически отбрасываются в конце сеанса или транзакции. Если вы создаете временную таблицу с тем же именем, что и постоянная таблица, вы должны префикс постоянной таблицы с ее именем схемы, чтобы ссылаться на нее, пока существует временная таблица.

Если вы хотите эмулировать реализацию SQL Server, вы можете использовать определенные префиксы для своих временных таблиц.

 Смежные вопросы

  • Нет связанных вопросов^_^