我正在使用 PostgreSQL PostgreSQL 13.9 和 PostGIS 3.1 扩展来计算较大表中点样本之间的向量。
如果我在下面的示例中使用点表示法指定各个字段名称,则该函数可以正常工作:
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 ;
test_vectors
表格看起来像:
x | y | z |
---|---|---|
-0.0940000000409782 | [空] | [空] |
但是,如果我将减法替换为
v1 := p3 - p1;
以在行级别进行操作,则会收到错误消息 ERROR: operator does not exist: test_vectors - test_vectors
。
令我困惑的是,当使用 LEAD 或 LAG 等窗口函数时,允许减去一行(例如 https://dba.stackexchange.com/questions/300023/postgresql-subtract-to-each-row-the -上一行)。 为什么这在声明了 ROWTYPE 的函数中不起作用?