2017-06-27 52 views
1

我有一個簡單的函數來更新表中的列。我想返回布爾值來指示更新是否成功。INSERT命令後從SQL函數返回布爾值

下面是函數:

CREATE OR REPLACE FUNCTION api.file_confirm_upload_to_s3(_file_guid uuid) 
RETURNS bool AS 
$BODY$ 
    UPDATE main.file 
    SET is_uploaded_to_s3 = true 
    WHERE guid = _file_guid 
    RETURNING CASE WHEN guid IS NULL THEN false ELSE true END 
$BODY$ 
    LANGUAGE SQL 
    VOLATILE 
    SECURITY DEFINER; 

該函數返回一個成功更新後TRUE,但不成功的更新後返回NULL 。空是虛假的,所以它適用於我,但我確實想知道如何解決這個問題。

不成功的更新將返回一個空的數據集,該數據集產生NULL,因此返回值。我如何測試空數據集與非空數據集,而不是檢查guid字段的值? JGH的回答後


編輯.. 下面是代碼,我想要做什麼。我必須切換到plpgsql才能訪問FOUND變量。

CREATE OR REPLACE FUNCTION api.file_confirm_upload_to_s3(_file_guid uuid) 
RETURNS bool AS 
$BODY$ 
BEGIN 
    UPDATE main.file 
    SET is_uploaded_to_s3 = true 
    WHERE guid = _file_guid; 

    RETURN FOUND; 
END; 
$BODY$ 
    LANGUAGE plpgsql 
    VOLATILE 
    SECURITY DEFINER; 

回答

2

只需使用return found; 這個特殊變量包含布爾值,指示一個或多個行是否正在使用前查詢中找到。 閱讀其文檔41.5.5 here和示例41-2 there

+0

謝謝你做到這一點。我不得不切換到plpgsql來訪問找到的變量。我用最後的代碼更新了我的問題,供其他人查找。 – Michael

3

您也可以在SQL模式

... 
with c as(-- put your update into cte 
    UPDATE main.file 
    SET is_uploaded_to_s3 = true 
    WHERE guid = _file_guid 
    RETURNING guid 
) 
select exists(select guid from c); 
... 
+0

謝謝。我更喜歡更清潔的plpgsql解決方案。但我會牢記這一招。 – Michael