我正在使用带有PostGIS3.1扩展的PostgreSQL PostgreSQL 13.9来计算一个较大表格中的样本点之间的矢量.
如果我在下面的示例中使用点符号指定各个字段名称,则该函数可以正常工作:
CREATE OR REPLACE FUNCTION get_vectors() RETURNS void
AS $$
DECLARE points CURSOR FOR SELECT st_x(geom) as x, st_y(geom) as y, st_z(geom) as z FROM test_table ORDER BY id LIMIT 3;
p1 test_vectors%ROWTYPE;
p3 test_vectors%ROWTYPE;
v1 test_vectors%ROWTYPE;
BEGIN
OPEN points;
FETCH FIRST FROM points INTO p1;
FETCH NEXT FROM points INTO p3;
v1.x := p3.x - p1.x;
DELETE FROM test_vectors;
INSERT INTO test_vectors VALUES (v1.*);
CLOSE points;
END;
$$ LANGUAGE plpgsql;
SELECT get_vectors();
SELECT * FROM test_vectors ;
百人表如下所示:
x | y | z |
---|---|---|
-0.0940000000409782 | [null] | [null] |
但是,如果我将减法替换为v1 := p3 - p1;
以在行级别进行操作,我会得到一个错误,显示为ERROR: operator does not exist: test_vectors - test_vectors
.
让我困惑的是,当使用窗口函数,如领先或滞后时,允许减go 一行(例如https://dba.stackexchange.com/questions/300023/postgresql-subtract-to-each-row-the-previous-row). 为什么这在声明了ROWTYPE的函数中不起作用?