-- PostgreSQL 9.2で動作確認しました
-- 前提:sp_drop_function_allという名前のストアドプロシージャはないと仮定
CREATE OR REPLACE FUNCTION sp_drop_function_all(
) RETURNS int AS $$
DECLARE
cur refcursor;
sql_text text;
BEGIN
OPEN cur FOR
SELECT
'DROP FUNCTION IF EXISTS ' || p.proname || '(' || pg_catalog.oidvectortypes(p.proargtypes) || ');'
FROM
pg_catalog.pg_proc AS p
LEFT JOIN
pg_catalog.pg_namespace AS n
ON
n.oid = p.pronamespace
WHERE
p.prorettype <> 'pg_catalog.cstring'::pg_catalog.regtype
AND
(
p.proargtypes[0] IS NULL
OR
p.proargtypes[0] <> 'pg_catalog.cstring'::pg_catalog.regtype
)
AND
NOT p.proisagg
AND
n.nspname = 'public'
AND
pg_catalog.pg_function_is_visible(p.oid)
AND
p.proname != 'sp_drop_function_all'
;
LOOP
FETCH NEXT FROM
cur
INTO
sql_text
;
IF NOT FOUND THEN
EXIT;
END IF;
--RAISE NOTICE '%', sql_text;
EXECUTE sql_text;
END LOOP;
CLOSE cur;
RETURN 0;
END;
$$ LANGUAGE plpgsql;
SELECT * FROM sp_drop_function_all();
DROP FUNCTION IF EXISTS sp_drop_function_all();