加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 15:50:52 所属栏目:百科 来源:网络整理
导读:我有一个像这样组织的功能: 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; 我有一个表,其中的参数组织了
我有一个像这样组织的功能:

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;

我有一个表,其中的参数组织了路点数据类型的结构.此表未明确指出航点类型本身.

该函数按原样创建,但是,我无法通过传入我的表来调用它:

选择一切(航点);

或者选择所有内容(从temp中选择*);

但是它表示后者选择或接近选择语法错误,前者不存在列路点.

我该怎么办?

解决方法

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

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

  
   
  SELECT w::waypoint FROM waypoints w; 

  

06001

解决方案只有一步之遥:分解子查询中的行,然后执行转换.这样,列值被分解并直接包装到新类型中,而不会转换为文本和返回.无需单独列出所有列,也无需创建自定义强制转换:

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

或更短:

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

或者更短,但是:

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

> Is there a shortcut for SELECT * FROM?

SQL Fiddle

这是更短更快,在快速测试中使用30k行和简单类型比使用文本和背面快10倍.如果你有(大)jsonb列或任何复杂类型(昂贵的文本转换),差异会更大.

更重要的是,您不需要其他自定义复合(ROW)类型.每个表都已将其行自动定义为类型.只需使用现有的类型航点而不是航点(如果可能的话).那你需要的只是:

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

旁白:

>表没有“参数”而是列.
>您没有将表参数传递给此函数,而是传递行值.这就是你按名称传递一个表的方法:

> Table name as a PostgreSQL function parameter

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

功能

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

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 []来声明文本数组.

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读