Вопрос по sql, postgresql, plpgsql – Табличная переменная PostgreSQL

17

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

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.asp

Если я хорошо помню, вы не можете объявить переменную как TABLE, в postgresql нет типа TABLE. cojack
Функциональность такая же, как временная таблица. Просто в статье утверждается, что табличная переменная работает лучше всего в SQL Server. Clodoaldo Neto
спасибо за ответ Yavanosta

Ваш Ответ

2   ответа
23

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

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

Более подробная информация в руководстве оCREATE TABLE где можно найти эту цитату:

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

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

В стороне, относительноmoney тип данных

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

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

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;
   ...
На самом деле нет: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 <безымянный>: DO $ DECLARE _x xx []; НАЧАЛО _x: = Массив (SELECT * FROM xx); RAISE DEBUG '_x is%', _ x; END $ [2016-04-05 21:47:45] привязать <безымянный> к <неназванный> [2016-04-05 21:47:45] [42601]ERROR: подзапрос должен возвращать только один столбец Где: функция PL / pgSQL inline_code_block строка 3 при назначении` uudecode
да, это не работает, исправлено Pavel Stehule

Похожие вопросы