簡體   English   中英

在 PL/PgSQL 中訪問變量的數據

[英]Access data of variable in PL/PgSQL

我有一個這樣的 PL/PgSQL function:

CREATE FUNCTION get_value(firstval integer) RETURNS SETOF mytable AS
$func$
DECLARE
    current mytable;
BEGIN
    SELECT fv FROM mytable WHERE fv = fistval INTO current;
    IF current IS NULL THEN
        INSERT INTO mytable(fv) VALUES (firstval);
    END IF;
    RETURN current.fv;
END
$func$ LANGUAGE plpgsql;

我需要返回current變量的特定行( fv ),但是這段代碼不起作用(它不返回任何東西),那么我該怎么做呢?

有很多問題:

  1. current被聲明為記錄。 但是您嘗試將 integer 值分配給此復合變量SELECT INTO

  2. 表函數的返回應該通過RETURN TABLE語句來實現。 沒有任何名為mytable的表。 在 Postgres 概念中 - RETURNS SETOF mytable的意思是 - 返回類型為表“mytable”的行。

  3. 在這種情況下,測試IS NULL是不安全的。 你想檢查FOUND變量。

  4. 也許您不想返回表 - 那么SETOF子句使用不當。

     CREATE OR REPLACE FUNCTION get_value(firstval int) RETURNS mytable AS $$ DECLARE _r mytable; BEGIN SELECT * FROM mytable WHERE fv = firstval INTO _r; IF NOT FOUND THEN INSERT INTO mytable(fv) VALUES(firstval); SELECT * FROM mytable WHERE fv = firstval INTO _r; END IF; RETURN _r; END; $$ LANGUAGE plpgsql;

注意, - 此代碼可能會執行您想要的操作。 但它在競爭條件下是不安全的。 最好使用 Postgres 語句INSERT ON CONFLICT DO

請先嘗試閱讀文檔- 它的設計與您的預期不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM