Algunas veces es necesario recuperar el codigo de una funcion de la base de datos, o un grupo de funciones bajo un patron, por ejemplo quiero todas las funciones que empiecen con "act", en otros casos es necesario listar las declaraciones de las funciones para armar un catalogo o algo asi.
POSTGRES SQL
create or replace function ldj_listar_funciones(_nombre_funcion text, _codigo boolean) returns setof record as $$
-------------------------------
-- Autor: Luis A. Jordan P.
-- email: jordanluis@yahoo.com
-------------------------------
declare
_bucle record;
begin
for _bucle in
SELECT (case when _codigo then 'CREATE OR REPLACE ' else '' end || 'FUNCTION '|| p.proname ||'(' ||
CASE WHEN proallargtypes IS NOT NULL THEN
pg_catalog.array_to_string(
ARRAY(
SELECT
CASE
WHEN p.proargmodes[s.i] = 'i' THEN ''
WHEN p.proargmodes[s.i] = 'o' THEN 'OUT '
WHEN p.proargmodes[s.i] = 'b' THEN 'INOUT '
END ||
CASE
WHEN COALESCE(p.proargnames[s.i], '') = '' THEN ''
ELSE p.proargnames[s.i] || ' '
END ||
pg_catalog.format_type(p.proallargtypes[s.i], NULL)
FROM pg_catalog.generate_series(
1, pg_catalog.array_upper(p.proallargtypes, 1)
) AS s(i)
), ', '
)
ELSE
pg_catalog.array_to_string(
ARRAY(
SELECT
CASE
WHEN COALESCE(p.proargnames[s.i+1], '') = '' THEN ''
ELSE p.proargnames[s.i+1] || ' '
END ||
pg_catalog.format_type(p.proargtypes[s.i], NULL)
FROM
pg_catalog.generate_series(
0, pg_catalog.array_upper(p.proargtypes, 1)
) AS s(i)
), ', '
)
END ||
CASE WHEN p.proretset THEN ') returns setof ' ELSE ') returns ' END ||
pg_catalog.format_type(p.prorettype, NULL) || case when _codigo then ' as \$\$ ' || p.prosrc
|| '\$\$ language '||lanname else '' end ||';')::text as funcion
FROM pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
LEFT JOIN pg_catalog.pg_language l ON l.oid = p.prolang
JOIN pg_catalog.pg_roles r ON r.oid = p.proowner
WHERE p.proname ilike _nombre_funcion
AND NOT p.proisagg
AND pg_catalog.pg_function_is_visible(p.oid)
loop
return next _bucle;
end loop;
return;
end;
$$ language plpgsql;
SELECT * FROM ldj_listar_funciones('act%', true) as (funcion text);
SELECT * FROM ldj_listar_funciones('act%', false) as (funcion text); --catalogo
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario