从多个表中提取游标查看PostgreSQL
我一直试着从一个视图中获取所有的行,该视图是从多个表中创建的 我有两个表(位置和向量),分别对应两个自定义组合类型,type\u Position和type\u Vector 位置(id、系统时间、纬度、经度) 矢量(id、系统时间、速度) 我想在plpgsql过程中创建一个临时视图,以汇集所有位置和向量,并按sys_时间对它们进行排序,因此我写道:从多个表中提取游标查看PostgreSQL,sql,postgresql,view,cursor,plpgsql,Sql,Postgresql,View,Cursor,Plpgsql,我一直试着从一个视图中获取所有的行,该视图是从多个表中创建的 我有两个表(位置和向量),分别对应两个自定义组合类型,type\u Position和type\u Vector 位置(id、系统时间、纬度、经度) 矢量(id、系统时间、速度) 我想在plpgsql过程中创建一个临时视图,以汇集所有位置和向量,并按sys_时间对它们进行排序,因此我写道: CREATE TEMP VIEW posAndVectView AS SELECT * from posi
CREATE TEMP VIEW posAndVectView AS
SELECT * from position
UNION ALL
SELECT * from 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变量的类型应该是什么?
它似乎有时是一个类型向量,有时是一个类型位置…简单。类型应为
posAndVectView
与任何其他表一样,还有一个与临时表同名的复合类型
但是你需要一个视野吗?您可以使用
UNION
打开查询的光标。在这种情况下,您将使用typeposition
,因为它是第一个表。很简单。类型应为posAndVectView
与任何其他表一样,还有一个与临时表同名的复合类型
但是你需要一个视野吗?您可以使用
UNION
打开查询的光标。在这种情况下,您将使用typeposition
,因为它是第一个表。我发现答案非常简单。
我需要声明posOrVect变量,其类型为PostgreSQL中提到的record:
记录变量类似于行类型变量,但它们没有
预定义结构。它们采用行的实际行结构
它们是在“选择”或“用于”命令期间指定的。子结构
记录变量可以在每次分配时更改。A.
其结果是,在首次分配记录变量之前
到,它没有子结构,也没有任何试图访问其中某个字段的尝试
将绘制运行时错误
我发现答案很简单。 我需要声明posOrVect变量,其类型为PostgreSQL中提到的record: 记录变量类似于行类型变量,但它们没有 预定义结构。它们采用行的实际行结构 它们是在“选择”或“用于”命令期间指定的。子结构 记录变量可以在每次分配时更改。A. 其结果是,在首次分配记录变量之前 到,它没有子结构,也没有任何试图访问其中某个字段的尝试 将绘制运行时错误
我在过程主体中创建了视图,因此如果您是对的,这意味着在开始部分中实际创建我的视图之前,与我的视图对应的类型在DECLARE部分中已知?我将对此进行测试。我尝试使用posAndVectView和posAndVectView%ROWTYPE在DECLARE节中声明posOrVect变量,但正如我所料,我出现了一个错误,因为视图尚未创建,因此posAndVectView类型未知。你是对的。我没有注意到您在函数本身内部创建了临时视图。使用
记录
是一个很好的解决方案。但是,正如我所提到的,我不认为你真的需要一个视图。我在过程的主体中创建了视图,所以如果你是对的,这意味着与我的视图相对应的类型在DECLARE部分中已知,而在BEGIN部分中实际创建了我的视图?我将对此进行测试。我尝试使用posAndVectView和posAndVectView%ROWTYPE在DECLARE节中声明posOrVect变量,但正如我所料,我出现了一个错误,因为视图尚未创建,因此posAndVectView类型未知。你是对的。我没有注意到您在函数本身内部创建了临时视图。使用记录
是一个很好的解决方案。但正如我提到的,我不认为你真的需要一个视图。