该函数履行其职责,也就是说,如果没有带有该数据的集线器,它将添加该数据并返回其ID,否则它将找到包含从JSON输入的数据的hub ID。
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;当我运行这样的查询时,问题就出现了:
SELECT * FROM hub
WHERE hub.id = add_hub('
{
"name":"HUB TEST",
"city":"Los Angeles",
"province":"LA",
"address":"Street 1",
"region":"CA"
}
');如果集线器数据不存在于插入的表中,则带有SELECT的查询将不返回任何内容,如果再次执行,则返回正确的集线器。
奇怪的是,下面的查询总是有效的,并且总是返回hub id,即使在第一次添加数据时:
SELECT add_hub('
{
"name":"HUB TEST",
"city":"Los Angeles",
"province":"LA",
"address":"Street 1",
"region":"CA"
}
');它总是返回一个有效值,即使是在第一次迭代的情况下,所以我真的不明白我错了什么地方,如果您有任何建议,我会很感激。
发布于 2022-06-17 13:50:38
修改WHERE子句中的表数据是一个非常的坏主意。首先,函数的调用次数将与表中的行相同。第二,在执行查询时,服务器不能每次计算条件时都修改查询数据集。
如果要使用所描述的机制,最简单的解决方案是更改函数,使其返回整个已找到或插入的行,并使用问题中的最后一个查询。
https://stackoverflow.com/questions/72659825
复制相似问题