Re: Select default values

From: Maximilian Tyrtania <maximilian(dot)tyrtania(at)onlinehome(dot)de>
To: Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
Cc: <pgsql-sql(at)postgresql(dot)org>
Subject: Re: Select default values
Date: 2008-07-23 12:06:02
Message-ID: C4ACEB4A.302D6%maximilian.tyrtania@onlinehome.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

Pavel,

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

Maximilian Tyrtania

> Von: Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>

>> 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;

In response to

Browse pgsql-sql by date

  From Date Subject
Next Message Scott Marlowe 2008-07-23 14:29:58 Re: Select default values
Previous Message Pavel Stehule 2008-07-23 11:26:12 Re: Select default values