我想为postres写一个PLPGSQL函数,在成功时返回一个复杂类型,并在失败时返回一些其他复杂类型的SETOF。这可能吗?
我考虑过在失败时返回一个类型的数组,但是数组可能包含数万个条目,所以我假设将它作为数组返回是不明智的。这是正确的假设吗?
答案 0 :(得分:0)
您可以通过返回光标记录和复杂类型来执行此操作:
CREATE FUNCTION example(IN integer, INOUT refcursor, OUT boolean, OUT point) AS $$
BEGIN
IF 0 = $1 THEN -- Dummy condition
OPEN $2 FOR SELECT * FROM pg_class; -- Open the given cursor for some query.
$3 := true; -- Indicate that the operation was successful.
ELSE
$4 := point(1, 2); -- Return a composite type.
$3 := false;
END IF;
END;
$$ STABLE LANGUAGE plpgsql;
像这样使用:
BEGIN;
SELECT example(0, 'my_cursor');
-- Check the value of the first output parameter.
FETCH ALL IN 'my_cursor';
COMMIT;
但是,我认为这不会很方便。如果无法从视图或表中获取游标的内容,则需要使用另一个假定操作成功的函数。还有一个处理一组行或一个值的分支在SQL中很容易编写。