【问题标题】:Fetch cursor from multiple tables view PostgreSQL从多个表视图中获取游标 PostgreSQL
【发布时间】:2017-11-09 00:31:27
【问题描述】:

我尝试从多个表创建的视图中获取所有行,直到几个小时。

我有两个表(Position 和 Vector),分别对应两个自定义复合类型 type_positiontype_vector

位置(id、sys_time、lat、lon)

向量(id、sys_time、速度)

我想在 plpgsql 过程中创建一个临时视图来汇集所有位置和向量并按 sys_time 排序,所以我写道:

CREATE TEMP VIEW posAndVectView AS
                    SELECT * from position
                    UNION ALL
                    SELECT * from vector;

我需要遍历这个视图并根据 Position 和 Vector 属性进行一些工作。

所以我认为我应该使用光标:

DECLARE 
 manyRows refcursor;
BEGIN

OPEN manyRows FOR 
SELECT * FROM posAndVectView ORDER BY sys_time ASC;
LOOP
FETCH manyRows INTO posOrVect;
EXIT WHEN NOT FOUND;
...
END LOOP;
CLOSE manyRows; 

所以我的问题是 DECLARE 部分中 posOrVect 变量的类型应该是什么?

它似乎有时是 type_vector,有时是 type_position...

【问题讨论】:

    标签: sql postgresql view cursor plpgsql


    【解决方案1】:

    简单。类型应该是posAndVectView

    与任何其他表一样,也有一个与临时表同名的复合类型。

    但是你需要一个视图吗?您可以使用UNION 打开查询的游标。在这种情况下,您将使用类型 position,因为它是第一个表。

    【讨论】:

    • 我在过程的主体中创建了视图,所以如果你是对的,这意味着在我的视图在 BEGIN 部​​分中实际创建之前,在 DECLARE 部分中对应于我的视图的类型是已知的?我会测试一下。
    • 我尝试使用 posAndVectView 和 posAndVectView%ROWTYPE 在 DECLARE 部分声明 posOrVect 变量,但正如我所料,我遇到了错误,因为视图尚未创建,因此 posAndVectView 类型未知。跨度>
    • 你是对的。我错过了您在函数本身内创建临时视图。使用record 是一个很好的解决方案。但正如我所提到的,我认为你真的不需要对此有一个看法。
    【解决方案2】:

    我发现答案很简单。 我需要用 record 类型声明 posOrVect 变量,因为它在 PostgreSQL documentation 中提到:

    记录变量类似于行类型变量,但它们没有 预定义的结构。它们采用行的实际行结构 它们是在 SELECT 或 FOR 命令期间分配的。的子结构 记录变量可以在每次分配时更改。一种 这样做的结果是,直到第一次分配记录变量 到,它没有子结构,并且任何尝试访问其中的字段 将绘制一个运行时错误。

    【讨论】:

      猜你喜欢
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 2018-11-06
      相关资源
      最近更新 更多