gpt4 book ai didi

postgresql - 如何将表参数传递给此函数?

转载 作者:行者123 更新时间:2023-11-29 11:39:35 30 4
gpt4 key购买 nike

我有一个这样组织的函数:

create function everything(waypoints waypoint)
returns table(node int, xy text array) as $$
BEGIN
create view results as ...

return query (select * from results);
END;
$$ LANGUAGE plpgsql;

我有一个表,其中的参数按照 waypoint 数据类型的结构方式组织。此表本身不是明确的 waypoint 类型。

该函数按应有的方式创建,但是,我无法通过像这样传入我的表来调用它:

选择一切(航路点);

或者全选(select * from temp);

但它说后者的 select 处或附近有语法错误,前者不存在 waypoints 列。

我该如何继续?

最佳答案

在 Postgres 9.4 中测试的所有内容。

Postgres 在处理 ROW 类型的语法上有一些弱点。您不能直接从表(别名)转换:

<strike>SELECT w::waypoint FROM waypoints w;</strike>
ERROR:  cannot cast type waypoints to waypoint

解决方案仅一步之遥:在子查询中分解行,然后进行转换。这样,列值被分解并直接包装到新类型中,而无需强制转换为 text 并返回。无需单独列出所有列,也不需要创建自定义转换:

SELECT (w.*)::waypoint FROM (SELECT * FROM waypoints) w;

或更短:

SELECT w.*::waypoint FROM (TABLE waypoints) w;

或更短,但:

SELECT w::waypoint FROM (TABLE waypoints) w;

SQL Fiddle

在具有 30k 行和简单类型的快速测试中,这比强制转换为 text 并返回更快 10 倍。如果您有(大)jsonb 列或任何复杂类型(与 text 之间的昂贵转换),差异会更大。

更重要的是,您不需要另一种自定义复合 (ROW) 类型。每个表都已将其行自动定义为类型。只需使用现有类型 waypoints 而不是 waypoint (如果可能的话)。那么您只需要:

SELECT w FROM waypoints w;

或者,对于您的示例:

SELECT everything(t) FROM temp t;  -- using type waypoints
SELECT everything(t::waypoint) FROM (TABLE temp) t; -- using type waypoint

旁白:

  • 表格没有“参数”,只有列。
  • 不是表参数传递给此函数,而是行值。这就是按名称传递表的方式:

    您不能在 Postgres 中直接“传递整个表”作为参数,因为没有表变量。您可以为此使用游标或临时表。

函数

您的函数具有无效的类型声明并且不必要地复杂。我严重怀疑你想创建一个 View :

CREATE FUNCTION everything(_wp waypoint)  -- or use type waypoints
RETURNS TABLE(node int, xy text[]) AS
$func$
BEGIN
RETURN QUERY
SELECT ...
END
$func$ LANGUAGE plpgsql;

text array 不是有效的语法,使用 text[] 来声明 text 数组。

而不是使用表/类型名称 waypoints 作为函数参数名称,这会使您容易混淆错误。

或者,如果您的案例像演示的那样简单,则只需使用一个简单的 SQL 函数:

CREATE FUNCTION everything(_wp waypoint)  -- or use type waypoints
RETURNS TABLE(node int, xy text[]) AS
$func$
SELECT ...
$func$ LANGUAGE sql;

不要引用语言名称。这是一个标识符。

关于postgresql - 如何将表参数传递给此函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31148157/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com