2008/7/23 Maximilian Tyrtania <[EMAIL PROTECTED]>:
> Hi,
>
>> begin
>>   insert ...
>>  rollback;
>>
>> it's not best solution, but it just works.
>
> Ah, yes, of course, haven't thought of that.
>
> 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;



> With your way (insert into f(a,b) values(default, default) returning *) i
> need to know everything about the given table.
>
> Hmm. Any ideas?
>
> Best,
>
> Maximilian Tyrtania
>
>
>

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