Re: [pgsql-ru-general] Хранимая процедура: возврат строки разного формата

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.

In response to

Responses

Browse pgsql-ru-general by date

  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?