Re: Listar columnas de la llave primaria

From: Oswaldo Hernández <listas(at)soft-com(dot)es>
To: Juan Pablo Yañez <jyanez(at)sigma(dot)gov(dot)bo>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Listar columnas de la llave primaria
Date: 2005-08-20 10:42:28
Message-ID: 43070914.5060607@soft-com.es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Juan Pablo Yañez escribió:
> Hola a todos, necesito saber de que columnas consta la llave primaria de
> una determinada tabla, lo mas aproximado que encontre para solucionar mi
> problema fue la funcion pg_get_constraintdef, pero me gustaria saber si
> alguien tiene una consulta para obtenerlas directamente en forma de
> cursor o si me pueden idicar por donde debo buscar.
>
> Saludos y muchas gracias de antemano.
>

Hola,

Abajo te muestro la funcion que hice para obtener una lista de los
campos que componen la llave primaria de una tabla. Si le encuentras
algun fallo hazmelo saber.

Espero que te sirva, saludos,

--
*****************************************
Oswaldo Hernández
oswaldo(at)soft-com(dot)es
*****************************************

CREATE OR REPLACE FUNCTION describe_pk("varchar", "varchar")
RETURNS SETOF record AS
$BODY$
/********************************************************************
funcion para obtencion de los campos que componen el indice primario
de una tabla.

Devuelve un registro por cada campo con el nombre y tipo.
Si la tabla no tiene indice primario no devuelve ningun registro.

Uso:

select
campo,
tipo
from
describe_pk('nombre de esquema', 'nombre de tabla')
as (campo varchar, tipo varchar)
;

Abril 2005 Oswaldo

Posible problema si el indice estuviera formado por una espresion, pero
estas no estan permitidas en las PK

*********************************************************************/
declare
escenario alias for $1;
tabla alias for $2;
regret record;
pk record;
begin

-- obtecion de los datos del indice primario de la tabla y oid de tabla
y schema
select into pk
schemas.oid as oid_schema,
tablas.oid as oid_tabla,
indices.indexrelid as oid_pk,
indices.indkey as campos,
indices.indnatts as nvectores,
indices.indexprs as expresiones
from
pg_class as tablas
left join pg_namespace as schemas
on tablas.relnamespace = schemas.oid
left join pg_index as indices
on tablas.oid = indices.indrelid
where
schemas.nspname = escenario
and tablas.relname = tabla
and indices.indisprimary = true
;

-- comprueba si existe el indice primario en la tabla
if pk.nvectores > 0 then

-- bucle de obtencion de datos individuales de los campos desde
-- las tablas pg_attribute y pg_type
for i in 0..(pk.nvectores-1) loop
select into regret
campo.attname::varchar as campo,
tipos.typname::varchar as tipo
from
pg_attribute as campo
join pg_type as tipos
on campo.atttypid = tipos.oid
where
campo.attrelid = pk.oid_tabla and
campo.attnum = pk.campos[i]
;
return next regret;
end loop;
end if;

return;

end$BODY$
LANGUAGE 'plpgsql' STABLE SECURITY DEFINER;
ALTER FUNCTION describe_pk("varchar", "varchar") OWNER TO postgres;

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Paolo Lopez 2005-08-20 17:42:10 Triggers Help
Previous Message Marcos Matamala 2005-08-20 04:22:35 Re: Ayuda