database - PostgreSQL RETURN NEXT 错误“返回多于一行”
问题描述
我有一个冗长的 PGPLSQL 函数:这是一个总结
CREATE FUNCTION get_features_by_buffer(
p_buffer GEOMETRY
)
RETURNS SETOF JSON AS $BODY$
DECLARE
v_buffer GEOMETRY;
v_sql TEXT
BEGIN
FOR REC IN EXECUTE $$(
(
SELECT row_to_json(foo_pole) AS json FROM
(
SELECT * FROM pole WHERE $$ || v_sql_where || $$
) AS foo_pole
)
UNION ALL
(
SELECT row_to_json(foo_transformerbank) AS json FROM
(
SELECT * FROM transformerbank WHERE $$ || v_sql_where || $$) AS foo_transformerbank
)
)$$ LOOP
RETURN NEXT REC.json;
END LOOP;
END
$BODY$
LANGUAGE plpgsql;
我的函数返回RETURNS SETOF JSON
并且它比这里显示的要复杂一些,但是我已经运行了UNION ALL
语句内部的查询并且没有语法或其他错误。这里看起来很奇怪,因为我一直在修补,但我最初是通过将查询语句放入v_sql
并做来尝试的RETURN QUERY EXECUTE v_sql
,这也给出了与此处显示的版本相同的错误。错误如下:
错误:查询“SELECT get_features_by_buffer(v_buffer)”返回多于一行内容
:PL/pgSQL 函数 get_features_by_pole_distance(字符变化,双精度)在 RETURN NEXT 的第 7 行
我一直在修补这个,不知道我在这里缺少什么,与UNION ALL
?
解决方案
据我所知,您不需要光标。只需使用生成的 SQL 作为输入return query execute ...
:
使用该format()
函数生成动态 SQL 也更容易:
CREATE FUNCTION get_features_by_buffer(p_buffer GEOMETRY)
RETURNS SETOF JSON
AS
$BODY$
DECLARE
v_buffer GEOMETRY;
v_sql TEXT
BEGIN
RETURN QUERY EXECUTE
format(
'SELECT row_to_json(foo_pole) AS json
FROM (
SELECT *
FROM pole
WHERE %s
) AS foo_pole
UNION ALL
SELECT row_to_json(foo_transformerbank) AS json
FROM (
SELECT *
FROM transformerbank
WHERE %s
) AS foo_transformerbank', v_sql_where, v_sql_where);
END
$BODY$
LANGUAGE plpgsql;
由于该函数被声明为returns setof
您必须像表一样使用它:
select *
from get_features_by_buffer(...);
推荐阅读
- fonts - 使用 mpdf 时不显示某些字符(如“小于或等于”)
- drools - Drools,如何禁用前向链接?
- php - 如何使用 PHP 将 PNG 作为 BLOB 正确写入和读取到数据库?
- xml - 如何在特定元素索引处修改 pptx.oxml.xmlchemy.XmlString 对象的 xml?
- node.js - 无法使用 nestjs/mongoose 连接 mongoDB
- c++ - shared_ptr 没有功能
- c++ - 显式默认的默认构造函数被隐式删除,因为 unordered_map 与结构一起使用作为键
- firebase - 如何使用 Angular 8/9 隐藏 API 密钥?
- google-cloud-firestore - 有什么方法可以避免在高速互联网连接可用时延迟获取数据?(如果没有互联网连接,则不会延迟)
- java - 如何使用搜索字符串从 CSV 文件中删除特定行