Pavel,

fantastic, that's exactly what I wanted, thank you very much!

Maximilian Tyrtania

> Von: Pavel Stehule <[EMAIL PROTECTED]>

>> Okay, here is one final (i hope) obstacle. My db has >200 tables and I'd
>> love to be able to write some function that would just take a tablename and
>> return the default values for a new record of that table. If "Select default
>> values from sometable" was supported than that would be a piece of cake (I'd
>> just do: Execute "Select default values from '||sometable||' into
>> somerecord" in a plpgsql function).
>> 
> 
> that is out of SQL principles :(. And you cannot have functions that
> returns different number of columns - your function, can return array
> or table
> 
> CREATE OR REPLACE FUNCTION defaults(text, OUT attname name, OUT type
> varchar, OUT default_val varchar)
> RETURNS SETOF RECORD AS $$
> SELECT a.attname,
>   pg_catalog.format_type(a.atttypid, a.atttypmod),
>   (SELECT eval(pg_catalog.pg_get_expr(d.adbin, d.adrelid))
>    FROM pg_catalog.pg_attrdef d
>    WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef)
> FROM pg_catalog.pg_attribute a
> WHERE a.attrelid = $1::regclass::oid AND a.attnum > 0 AND NOT a.attisdropped
> ORDER BY a.attnum
> $$ LANGUAGE SQL STRICT;
> 
> postgres=# \d fg
>               Table "public.fg"
>  Column | Type |          Modifiers
> --------+------+-----------------------------
>  t      | date | default ('now'::text)::date
> 
> postgres=# \d f
>        Table "public.f"
>  Column |  Type   | Modifiers
> --------+---------+-----------
>  a      | integer | default 1
>  b      | integer |
> 
> postgres=# select * from defaults('fg');
>  attname | type | default_val
> ---------+------+-------------
>  t       | date | 2008-07-23
> (1 row)
> 
> postgres=# select * from defaults('f');
>  attname |  type   | default_val
> ---------+---------+-------------
>  a       | integer | 1
>  b       | integer |
> (2 rows)
> 
> regards
> Pavel Stehule
> 
> create or replace function eval(varchar) returns varchar as $$
> declare result varchar;
> begin
>   execute 'SELECT ' || $1 into result;
>   return result;
> end;$$ language plpgsql strict;



-- 
Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-sql

Reply via email to