Try:
CREATE OR REPLACE FUNCTION outer() RETURNS void AS $outer$ DECLARE s text; BEGIN CREATE OR REPLACE FUNCTION inner() RETURNS text AS $inner$ BEGIN RETURN 'inner'; END; $inner$ language plpgsql; SELECT inner() INTO s; RAISE NOTICE '%', s; DROP FUNCTION inner(); END; $outer$ language plpgsql;
In postgres 9.5 SELECT outer(); exits
psql:/vagrant/f.sql:14: NOTICE: inner
EDIT: if you do not drop the function at the end of the external function will remain visible to the rest of the database.
source share