INSERT命令后从SQL函数返回布尔值

时间:2017-06-27 11:27:52

标签: postgresql

我有一个简单的函数来更新表中的列。我想返回布尔值来指示更新是否成功。

这是功能:

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是假的,所以它对我有用,但我想知道如何才能解决这个问题。

不成功的更新返回一个空数据集,产生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 个答案:

答案 0 :(得分: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);
...

答案 1 :(得分:2)

只需使用return found; 此特殊变量包含一个布尔值,指示是否使用上一个查询找到了一行或多行。 阅读其文档41.5.5 here和示例41-2 there