【问题标题】:PostgreSQL table variablePostgreSQL 表变量
【发布时间】:2012-06-02 21:17:00
【问题描述】:

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

【问题讨论】:

  • 如果我记得你不能将变量声明为 TABLE,postgresql 中没有 TABLE 类型。
  • 功能与临时表相同。只是文章声称 table 变量在 SQL Server 中表现最好。
  • @ClodoaldoNeto 在 SQL Server 中,此用例有两个选项:第一个是像在 Postgres 中一样使用临时表,第二个是使用表变量。各有优势,视情况而定。

标签: sql postgresql plpgsql table-variable


【解决方案1】:

作为@Clodoaldo commented:在PostgreSQL 中使用临时表。以您为例:

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

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

如果指定,则将该表创建为临时表。暂时的 表在会话结束时自动删除,或者 可选地在当前事务结束时(参见 ON COMMIT 以下)。现有的同名永久表不可见 临时表存在时到当前会话,除非他们 用模式限定的名称引用。上创建的任何索引 临时表也自动成为临时表。

未记录的表是 PostgreSQL 9.1 的一个有点相关的特性。他们通过不写入WAL 来保存磁盘写入。这是discussion of the features by Robert Haas

另外,关于money 数据类型:

【讨论】:

  • 在 PostgreSQL 9.4 中,我可以安全地假设为每个调用使用临时表的函数的用户创建一个新的临时表实例,即使调用是同时的?
  • @DiligentKeyPresser:临时表仅在 same 数据库会话中可见,并在会话结束时被删除。在任何版本的 Postgres 中。当连接多次(几个会话)时,您甚至可以为同一个数据库用户拥有单独的临时表。在内部,每个会话都使用一个单独的临时架构。
  • This thread 建议 pg 数组可能相当于 T-SQL 内存表,而临时表可能会引入大量额外开销。
【解决方案2】:

你可以用复合类型数组代替

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] 解析 : DO $$DECLARE _x xx[]; BEGIN _x := 数组(SELECT * FROM xx); RAISE DEBUG '_x 是 %',_x; END$$ [2016-04-05 21:47:45] 将 绑定到 [2016-04-05 21:47:45] [42601] 错误:子查询必须只返回一列 Где: PL/pgSQL function inline_code_block line 3 at assignment`
猜你喜欢
  • 2020-08-17
  • 1970-01-01
  • 2022-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2018-04-07
相关资源
最近更新 更多