RETURN NEXT
just returns what output parameters currently hold. The manual:
If you declared the function with output parameters, write just RETURN NEXT
with no expression.
You object:
There are no OUT
parameters.
Output parameters are declared among function parameters with the keyword OUT
or INOUT
, or implicitly in your RETURNS
clause:
RETURNS TABLE(column1 integer, column2 boolean, ...)
Here, column1
and column2
are OUT
parameters, too.
This should do it:
CREATE OR REPLACE FUNCTION my_function()
RETURNS TABLE(column1 integer, column2 boolean, ...)
LANGUAGE plpgsql STABLE AS
$func$
BEGIN
FOR column1, column2, ... IN
SELECT * FROM other_function_returning_same_columns()
LOOP
IF something_wrong_with(column1, column2, ...) THEN
RAISE EXCEPTION 'Something went wrong';
END IF;
RETURN NEXT;
END LOOP;
END
$func$;
Simpler with a registered type
You can further simplify with a registered composite type:
CREATE TYPE mytype (column1 integer, column2 boolean, ...);
Or, if your type happens to match a table definition, you already have that type, because every table name can be used as type name in PostgreSQL. Then simplify:
CREATE OR REPLACE FUNCTION my_function()
RETURNS SETOF mytype
LANGUAGE plpgsql STABLE AS
$func$
DECLARE
_r mytype;
BEGIN
FOR _r IN
SELECT * FROM other_function_returning_same_columns()
LOOP
IF something_wrong_with(_r) THEN
RAISE EXCEPTION 'Something went wrong';
END IF;
RETURN NEXT _r;
END LOOP;
END
$func$;
Reorganize!
If you integrate the RAISE
command into your helper function something_wrong_with()
, invert the logic and more conveniently name it everything_groovy()
, then you can completely replace my_function()
with this simple query:
SELECT *
FROM other_function_returning_same_columns() f
WHERE everything_groovy(f);
Or integrate the RAISE
into the base function other_function_returning_same_columns()
to further simplify (and make it faster). If you only want to RAISE EXCEPTION
in certain situations, you can always add a parameter (with a default) to switch it on / off.