CREATE OR REPLACE function diag_vs_found()
RETURNS boolean
LANGUAGE plpgsql AS $$
DECLARE
was_found boolean := false;
numrows integer;
rndsql text;
BEGIN
rndsql := 'UPDATE actor SET actor_id = actor_id';
EXECUTE rndsql;
IF FOUND THEN
was_found := true;
END IF;
GET DIAGNOSTICS numrows := row_count;
RAISE NOTICE '%',numrows;
RETURN was_found;
END
$$;
pagila=# select diag_vs_found();
NOTICE: 200
diag_vs_found
---------------
f
(1 row)
Checking Status of EXECUTE Statements in Plpgsql
Was hacking around in some [http://www.postgresql.org/docs/8.1/interactive/plpgsql.html plpgsql] today when I was reminded of something that, to me, seems rather counter-intuitive. It has to do with the setting of the FOUND variable VS. the GET DIAGNOSTIC information by way of EXECUTE statements. Generally you would think that if PostgreSQL can determine the GET DIAGNOSTIC information (like ROW COUNT) that it could also figure out which way the FOUND variable should be set. Apparently not though.
As you can see, the RAISE NOTICE successfully gives us the right number of rows updated, but FOUND is never set to TRUE. I’m not sure why it works like that, but it does, so it’s something to watch out for if you’re trying to test the success of your EXECUTEd statements. .