From: | Dmitriy Igrishin <dmitigr(at)gmail(dot)com> |
---|---|
To: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
Cc: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: [pgsql-ru-general] Хранимая процедура: возврат строки разного формата |
Date: | 2011-03-07 19:31:41 |
Message-ID: | AANLkTi=fQpvKtDOiqvE98+sjrcac2KtMO5zmgzNjLnbn@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-ru-general |
7 марта 2011 г. 21:13 пользователь Dmitry E. Oboukhov <unera(at)debian(dot)org>написал:
> есть таблица
>
> parent:
> | id | somecol |
>
> есть десяток унаследованных таблиц:
>
> childX:
> | id | somecol | .... |
>
>
> есть некий скрипт, который обрабатывает все данные в унаследованных по
> каким-то критериям.
>
> работает примерно так:
>
> 1. делает
> SELECT
> parent.id,
> pg_class.relname AS tbl
> FROM
> parent, pg_class
> WHERE
> pg_class.oid = r.tableoid
> LIMIT 1;
>
> 2. если результаты есть делает
> SELECT
> %1 AS tbl,
> *
> FROM
> %1
> WHERE
> id = %2
>
> где вместо %1 подставляется поле tbl выбранное из первого
> запроса, а вместо %2 - id.
>
> После того как результаты обработаны они удаляются из унаследованной
> таблицы.
>
> вот хочется запхать 1 и 2 в хранимую процедуру, пишем:
>
> CREATE OR REPLACE FUNCTION foo() RETURNS RECORD AS $$
> DECLARE
> retval RECORD;
> recid RECORD;
> BEGIN
> SELECT
> p.id,
> pg_class.relname AS tbl
> INTO
> recid
> FROM
> parent, pg_class
> WHERE
> parent.tableoid = pg_class.oid
> LIMIT 1;
>
> EXECUTE
> 'SELECT '''
> || recid.tbl
> || ''' AS tbl, * FROM "'
> || recid.tbl
> || '" WHERE id = '
> || recid.id
> INTO retval;
> RETURN retval;
> $$ LANGUAGE 'plpgsql';
>
> получаем примерно то что надо но в виде одного значения:
>
> foo: '(tblname,1234,abc,...)'
>
> а хочется получить в виде такого результата как вернул бы SELECT, то
> есть в виде хеша:
>
> tbl: tblname
> id: 1234
> somecol: 'abc'
> ...
>
Используйте SELECT * FROM foo();
>
>
> И еще, квоттинг: в документации написано что можно использовать
> функции quote_ident и quote_value для создания динамических запросов,
> но у меня почему-то постгрис на них ругается, говорит: нет такой
> функции
>
Если функции quote_ident(), quote_literal() и quote_nullable(). Первая
принимает в кач-ве аргумента только текст, а вторая и третья перегружены.
Проверьте аргумент какого типа Вы указываете при вызове.
> --
>
> . ''`. Dmitry E. Oboukhov
> : :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
> `. `~’ GPGKey: 1024D / F8E26537 2006-11-21
> `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
>
--
// Dmitriy.
From | Date | Subject | |
---|---|---|---|
Next Message | Dmitriy Igrishin | 2011-03-07 19:32:28 | Re: [pgsql-ru-general] хранимая процедура: как вернуть NOT FOUND? |
Previous Message | Dmitry E. Oboukhov | 2011-03-07 18:23:05 | Re: хранимая процедура: как вернуть NOT FOUND? |