Re: obtener info de tabla: campos, restricciones

From: "Blas Lopez" <blaslopez(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: obtener info de tabla: campos, restricciones
Date: 2007-04-05 18:12:59
Message-ID: 7600ceb70704051112g2a32b353xc1ff0d35ee582261@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Utilizo pgAdmin III y Postgresql manager lite 3 para administrar el servidor.
Analizando un poco el esquema vi que puedo sacar informacion de dos
tablas pg_class y pg_constraint donde aparecen las tablas con sus oid
y las claves primarias y foraneas tambien con sus oid.
Por eso se me ocurrio escribir una funcion que reciba el nombre de la
tabla y trate de devolver el/los campo/s que figura/n como clave
primaria y/o el/los campo/s que figuran como clave/s foranea/s como
sigue:

CREATE OR REPLACE FUNCTION "public"."f_TablaClavesPrimyAjenas"
("Tabla" varchar) RETURNS SETOF varchar AS
$body$
/* Funcion que devuelve Nombre de los campos que son
clave Primaria y Ajenas */
begin
select oid, conname, contype, conrelid, conkey, confkey
from pg_constraint
where conrelid = f_Tablaoid(Tabla);
end;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

Todavia esta incompleta, pero se ve que necesito el oid de la tabla
para acceder. Ademas no se si mi logica esta bien o falta algo, recien
comienzo con PL.

La otra funcion seria:

CREATE OR REPLACE FUNCTION "public"."f_Tablaoid" ("Tabla" varchar)
RETURNS oid AS
$body$
/* Funcion que devuelve el oid de una Tabla */
DECLARE
Tabla alias for $1;
begin
select oid, relname
from pg_class
where relname=Tabla;
return pg_class.oid;
end;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

Pero al ejecutar esta con Postgresql manager lite me devuelve:

ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT: PL/pgSQL function "f_Tablaoid" line 5 at SQL statement

Algo esta faltando seguramente pero no se que es.

El 5/04/07, José Manuel Ruiz <josemanuelruizbaena(at)gmail(dot)com> escribió:
> Sé que se puede saber esto que pides haciendo select a las que forman el
> diccionario de datos de tu base de datos. Pero si te conectas con "psql" a
> tu base de datos (desde la línea de comandos de linux sé que podrás hacerlo
> "psql <nombreDB>" como usuario postgres). Una vez conectado haces "\d
> <nombreTabla>" y te devolverá la descripción de la tabla que es lo que creo
> que buscas (en oracle DESC <nombreTabla>).
>
> Un saludo.
>
> El día 4/04/07, Blas Lopez <blaslopez(at)gmail(dot)com> escribió:
> >
> > Hola, soy un poco nuevo, comence a trabajar con Postgres sobre Windows
> > en Enero para recibirme de programador.
> > Estoy con VB6, y ahora necesitaria saber como obtener informacion
> > sobre una Tabla: campos (columnas), y restricciones (clave principal y
> > clave foranea).
> > Es decir ¿que tipo de consulta me devuelve esa información? Aclaro que
> > todas las tablas se encuentran en el esquema Public y tengo instalado
> > Postgres 8.2
> > Desde ya gracias.
> >
> > ---------------------------(fin del
> mensaje)---------------------------
> > TIP 8: explain analyze es tu amigo
> >
>
>
>
> --
> "Comparte lo que sabes, aprende lo que no sepas"
> Todo por el conocimiento libre
>
> Linux user number 441469

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2007-04-05 18:18:44 Re: Como crear una secuencia dentro de una funcion poniendole un nombre que dependa del parametro de la función
Previous Message Sandro Martínez 2007-04-05 18:06:33 Re: Como crear una secuencia dentro de una funcion poniendole un nombre que dependa del parametro de la función