Табличная переменная PostgreSQL

Есть ли в T-SQL что-то вроде табличных переменных?
В Sql Server это выглядит так:

DECLARE @ProductTotals TABLE
(
  ProductID int,
  Revenue money
)

Затем в процедуре я могу:

INSERT INTO @ProductTotals (ProductID, Revenue)
  SELECT ProductID, SUM(UnitPrice * Quantity)
  FROM [Order Details]
  GROUP BY ProductID

И манипулировать с этой переменной как с обычной таблицей.

Вот описание: http://odetocode.com/Articles/365.aspx


person Yavanosta    schedule 28.05.2012    source источник
comment
Если я хорошо помню, вы не можете объявить переменную как TABLE, в postgresql нет типа TABLE.   -  person cojack    schedule 28.05.2012
comment
Функциональность такая же, как у временной таблицы. Просто в статье утверждается, что табличная переменная лучше всего работает в SQL Server.   -  person Clodoaldo Neto    schedule 28.05.2012
comment
@ClodoaldoNeto в SQL Server для этого варианта использования есть два варианта: первый — использовать временную таблицу, как в Postgres, второй — использовать табличную переменную. У каждого есть преимущества в зависимости от обстоятельств.   -  person Rob_vH    schedule 12.09.2019


Ответы (2)


Как прокомментировал @Clodoaldo: используйте временную таблицу в PostgreSQL. Для вашего примера:

CREATE TEMP TABLE product_totals (
   product_id int
 , revenue money
);

Дополнительные сведения см. в руководстве по CREATE TABLE, где можно найти эту цитату. :

Если указано, таблица создается как временная таблица. Временные таблицы автоматически удаляются в конце сеанса или, необязательно, в конце текущей транзакции (см. ON COMMIT ниже). Существующие постоянные таблицы с тем же именем невидимы для текущего сеанса, пока существует временная таблица, если только на них не ссылаются с именами, определенными схемой. Любые индексы, созданные во временной таблице, также автоматически становятся временными.

Незарегистрированные таблицы — это несколько связанная функция PostgreSQL 9.1. Они экономят количество операций записи на диск, не записывая в WAL. Вот обсуждение функций Робертом Хаасом.

Кроме того, относительно типа данных money:

person Erwin Brandstetter    schedule 28.05.2012
comment
Могу ли я с уверенностью предположить, что в PostgreSQL 9.4 для каждого пользователя, вызывающего функцию, которая использует временную таблицу, создается новый экземпляр временной таблицы, даже если вызовы одновременны? - person Diligent Key Presser; 09.11.2015
comment
@DiligentKeyPresser: временные таблицы видны только в рамках одного и того же сеанса базы данных и удаляются в конце сеанса. В любой версии Postgres. Вы даже можете иметь отдельные временные таблицы для одного и того же пользователя базы данных при нескольких подключениях (несколько сеансов). Внутри для каждого сеанса используется отдельная временная схема. - person Erwin Brandstetter; 09.11.2015
comment
В этой теме предполагается, что массивы pg могут быть эквивалентными таблицы памяти T-SQL, и что временные таблицы могут создавать много дополнительных накладных расходов. - person dleavitt; 29.05.2017

Вместо этого вы можете использовать массив составного типа

CREATE TABLE xx(a int, b int);

CREATE OR REPLACE FUNCTION bubu()
RETURNS void AS $$
DECLARE _x xx[];
BEGIN
   _x := ARRAY(SELECT xx FROM xx);
   RAISE NOTICE '_x=%', _x;
   ...
person Pavel Stehule    schedule 09.06.2012
comment
Действительно нет: CREATE TABLE xx(a int, b int); insert into xx values(1,2); insert into xx values(3,4); DO $$DECLARE _x xx[]; BEGIN _x := ARRAY(SELECT * FROM xx); RAISE DEBUG '_x is %',_x; END$$; code` [2016-04-05 21:47:45] parse ‹unnamed›: DO $$DECLARE _x xx[]; НАЧАЛО _x := МАССИВ (ВЫБРАТЬ * ИЗ хх); RAISE DEBUG '_x равно %',_x; END$$ [2016-04-05 21:47:45] привязать ‹unnamed› к ‹unnamed› [2016-04-05 21:47:45] [42601] ОШИБКА: подзапрос должен возвращать только один столбец< /i> Где: функция PL/pgSQL inline_code_block, строка 3 при назначении` - person uudecode; 05.04.2016