該函式履行其職責,也就是說,如果沒有帶有該資料的集線器,它會添加它并回傳其 ID,否則它會找到帶有從 JSON 輸入中傳遞的資料的集線器 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 的查詢不會回傳任何內容,如果再次執行它會回傳正確的集線器。
奇怪的是,即使第一次添加資料,以下查詢總是有效并且總是回傳集線器 ID:
SELECT add_hub('
{
"name":"HUB TEST",
"city":"Los Angeles",
"province":"LA",
"address":"Street 1",
"region":"CA"
}
');
它總是回傳一個有效值,即使在第一次迭代的情況下,所以我真的不明白我錯在哪里,如果你有任何建議,我將不勝感激。
uj5u.com熱心網友回復:
修改 WHERE 子句中的表資料是一個非常糟糕的主意。首先,該函式將被呼叫的次數與表中的行數一樣多。其次,在執行查詢時,服務器不能在每次評估條件時修改查詢的資料集。
如果您想使用所描述的機制,最簡單的解決方案是更改函式,以便它回傳整個找到或插入的行并使用您問題中的最后一個查詢。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/492793.html
標籤:PostgreSQL 功能 plpgsql
