Re: Dynamically discovering field names in PLPGSQL queries - Mailing list pgsql-general

From will trillich
Subject Re: Dynamically discovering field names in PLPGSQL queries
Date
Msg-id 20010823032524.G15403@serensoft.com
Whole thread Raw
In response to Dynamically discovering field names in PLPGSQL queries  ("Oberpriller, Wade D." <oberpwd@nsc-msg01.network.com>)
List pgsql-general
On Mon, Aug 20, 2001 at 04:44:13PM -0500, Oberpriller, Wade D. wrote:
> Is there a way to discover the names of the fields in a record from a SELECT
> statement in PLPGSQL?
>
> For example:
>
> SELECT INTO REC * FROM mytable;
>
> Is there a mechanism to determine what the "*" expanded to? or does a
> programmer always have to know the layout of the table apriori?

to see the inner workings of postgresql, try
    psql -E
from which you can learn buckets and heaps.

to wit:

$ psql -E db -c '\d cust'

********* QUERY *********
SELECT relhasindex, relkind, relchecks, reltriggers, relhasrules
FROM pg_class WHERE relname='cust'
*************************

********* QUERY *********
SELECT a.attname, format_type(a.atttypid, a.atttypmod), a.attnotnull, a.atthasdef, a.attnum
FROM pg_class c, pg_attribute a
WHERE c.relname = 'cust'
  AND a.attnum > 0 AND a.attrelid = c.oid
ORDER BY a.attnum
*************************

********* QUERY *********
SELECT substring(d.adsrc for 128) FROM pg_attrdef d, pg_class c
WHERE c.relname = 'cust' AND c.oid = d.adrelid AND d.adnum = 1
*************************

********* QUERY *********
SELECT c2.relname
FROM pg_class c, pg_class c2, pg_index i
WHERE c.relname = 'cust' AND c.oid = i.indrelid AND i.indexrelid = c2.oid
ORDER BY c2.relname
*************************

                                       Table "cust"
 Attribute |         Type          |                       Modifier
-----------+-----------------------+------------------------------------------------------
 cust_id   | integer               | not null default nextval('"cust_cust_id_seq"'::text)
 name      | character varying(60) | not null
 login     | character varying(12) | not null
 acct      | character varying(30) | not null
 passwd    | character varying(25) | not null
Indices: cust_cust_id_key,
         cust_pkey


one of those four internal psql-generated wonders gives us what
we wanted--

db=# SELECT a.attname, format_type(a.atttypid, a.atttypmod), a.attnotnull, a.atthasdef, a.attnum
db=> FROM pg_class c, pg_attribute a
db=> WHERE c.relname = 'cust'
db=>   AND a.attnum > 0 AND a.attrelid = c.oid
db=> ORDER BY a.attnum;

 attname |      format_type      | attnotnull | atthasdef | attnum
---------+-----------------------+------------+-----------+--------
 cust_id | integer               | t          | t         |      1
 name    | character varying(60) | t          | f         |      2
 login   | character varying(12) | t          | f         |      3
 acct    | character varying(30) | t          | f         |      4
 passwd  | character varying(25) | t          | f         |      5
(5 rows)



--
Khan said that revenge is a dish best served cold. I think
sometimes it's best served hot, chunky, and foaming.
    - P.J.Lee ('79-'80)

will@serensoft.com
http://sourceforge.net/projects/newbiedoc -- we need your brain!
http://www.dontUthink.com/ -- your brain needs us!

pgsql-general by date:

Previous
From: Jeff Davis
Date:
Subject: Re: add, subtract bool type
Next
From: Miroslav Koncar
Date:
Subject: Re: problems transfering databases