PostgreSQL表变量

Yav*_*sta 19 sql postgresql plpgsql table-variable

在T-SQL中有什么类似表变量的吗?
在Sql Server中,它看起来像这样:

DECLARE @ProductTotals TABLE
(
  ProductID int,
  Revenue money
)
Run Code Online (Sandbox Code Playgroud)

然后在程序中我可以:

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

并像普通表一样操纵这个变量.

这是描述:http://odetocode.com/Articles/365.aspx

Erw*_*ter 23

正如@Clodoaldo评论的那样:在PostgreSQL中使用临时表.对于你的例子:

CREATE TEMP TABLE product_totals (
   product_id int
 , revenue money
);
Run Code Online (Sandbox Code Playgroud)

手册中有关CREATE TABLE您可以在何处找到此报价的更多信息:

如果指定,则将表创建为临时表.临时表在会话结束时自动删除,或者可选地在当前事务结束时删除(请参阅下面的ON COMMIT).当临时表存在时,当前会话不会显示具有相同名称的现有永久表,除非它们使用模式限定名称引用.在临时表上创建的任何索引也是自动临时的.

未记录的表是PostgreSQL 9.1的一个相关功能.他们通过不写入WAL来节省磁盘写入.以下是Robert Haas对这些功能讨论.

另外,关于money数据类型:

  • @DiligentKeyPresser:临时表仅在*same*数据库会话中可见,并且在会话结束时被删除.在任何版本的Postgres.连接多次(几个会话)时,甚至可以为同一个db用户提供单独的临时表.在内部,每个会话使用单独的临时模式. (3认同)
  • [此线程](https://www.postgresql.org/message-id/CAFj8pRBmxtxGDKG3pAgieS6UD_aaT3PysGMBqA%3DCmDwd1Hf2hg%40mail.gmail.com)表明pg数组可能相当于T-SQL内存表,并且临时表可以引入很多额外的开销。 (2认同)

Pav*_*ule 6

您可以改为使用复合类型数组

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;
   ...
Run Code Online (Sandbox Code Playgroud)

  • 确实没有:`CREATE TABLE xx(a int, b int); 插入 xx 值(1,2);插入 xx 值(3,4);DO $$DECLARE _x xx[]; 开始 _x := 数组(从 xx 选择 *); RAISE DEBUG '_x 是 %',_x; 结束$$; `code` [2016-04-05 21:47:45] 解析 <未命名>: DO $$DECLARE _x xx[]; 开始 _x := 数组(从 xx 选择 *); RAISE DEBUG '_x 是 %',_x; END$$ [2016-04-05 21:47:45] 将 <unnamed> 绑定到 <unnamed> [2016-04-05 21:47:45] [42601] *错误:子查询必须仅返回一列* Где: PL/pgSQL 函数 inline_code_block 第 3 行赋值` (2认同)