首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不适用于第一个函数调用的Postgres选择

不适用于第一个函数调用的Postgres选择
EN

Stack Overflow用户
提问于 2022-06-17 13:02:43
回答 1查看 55关注 0票数 1

该函数履行其职责,也就是说,如果没有带有该数据的集线器,它将添加该数据并返回其ID,否则它将找到包含从JSON输入的数据的hub ID。

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION public.add_hub(
    new_hub json,
    OUT hub_id bigint)
    RETURNS bigint
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS $BODY$
DECLARE
hub_name hub.name%TYPE := new_hub->>'name';
hub_city hub.city%TYPE := new_hub->>'city';
hub_province hub.province%TYPE := new_hub->>'province';
hub_region hub.region%TYPE := new_hub->>'region';
hub_address hub.address%TYPE := new_hub->>'address';

BEGIN
    SELECT hub.id FROM hub 
        WHERE name = hub_name 
            AND city = hub_city 
            AND province = hub_province
            AND address = hub_address 
            AND region = hub_region 
            INTO hub_id;

   IF NOT FOUND THEN
         INSERT INTO public.hub(name, city, province, address, region)
            VALUES (hub_name, hub_city, hub_province, hub_address, hub_region)
            RETURNING hub.id INTO hub_id;
   END IF;
   
END;
$BODY$;

ALTER FUNCTION public.add_hub(json)
    OWNER TO postgres;

当我运行这样的查询时,问题就出现了:

代码语言:javascript
复制
SELECT * FROM hub 
  WHERE hub.id = add_hub('
  {
   "name":"HUB TEST",
   "city":"Los Angeles",
   "province":"LA",
   "address":"Street 1",
   "region":"CA"
  }
');

如果集线器数据不存在于插入的表中,则带有SELECT的查询将不返回任何内容,如果再次执行,则返回正确的集线器。

奇怪的是,下面的查询总是有效的,并且总是返回hub id,即使在第一次添加数据时:

代码语言:javascript
复制
SELECT add_hub('
  {
   "name":"HUB TEST",
   "city":"Los Angeles",
   "province":"LA",
   "address":"Street 1",
   "region":"CA"
  }
');

它总是返回一个有效值,即使是在第一次迭代的情况下,所以我真的不明白我错了什么地方,如果您有任何建议,我会很感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-17 13:50:38

修改WHERE子句中的表数据是一个非常的坏主意。首先,函数的调用次数将与表中的行相同。第二,在执行查询时,服务器不能每次计算条件时都修改查询数据集。

如果要使用所描述的机制,最简单的解决方案是更改函数,使其返回整个已找到或插入的行,并使用问题中的最后一个查询。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72659825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档