Как создать функцию sql, используя временные последовательности и SELECT на PostgreSQL8 - PullRequest
1 голос
/ 23 апреля 2010

У меня есть эта проблема в PostgreSQL 8.3 или 8.4:

Я создал скрипт, который (повторно) создает три временные последовательности, а затем использует их для транспонирования некоторых таблиц, чтобы получить одну строку.

Теперь я хочу поместить его в ФУНКЦИЮ, которая возвращает уже созданный тип (я сделал выборку, а затем взял поля из созданной таблицы для создания пользовательского типа).Вот сценарий ... Дело в том, что pgsql говорит, что отношение 'q' не существует и выполнение этого SQL без функции успешно ...я должен догадаться, что создание последовательности не может быть сделано внутри функции SQL?Спасибо !!

CREATE OR REPLACE FUNCTION myNewFunction(int) RETURNS SETOF myExistingType AS $$
DROP SEQUENCE IF EXISTS p;
CREATE TEMP sequence p;
DROP SEQUENCE IF EXISTS q;
CREATE TEMP sequence q;
DROP SEQUENCE IF EXISTS r;
CREATE TEMP sequence r;
SELECT
    a.ad_field1,
    a.ad_field2,
    a.ad_field3,
    ...
    a.consecutive
    children.*,
    people.*,
    reffinancieras.*,
    CAST(character varying 'test' as text)
--INTO test_table
FROM 
    pit_adquiriente AS a,

    (SELECT 
        MAX(consulta.n1) as nombrehijo1, 
        MAX(consulta.f1) as fechahijo1, 
        MAX(consulta.n2) as nombrehijo2, 
        MAX(consulta.f2) as fechahijo2,
        MAX(consulta.n3) as nombrehijo3, 
        MAX(consulta.f3) as fechahijo3, 
        MAX(consulta.n4) as nombrehijo4, 
        MAX(consulta.f4) as fechahijo4
    FROM (SELECT adquirientepadre, nextval('q') as consecutivo,
        CASE WHEN currval('q')=1 THEN nombrehijo END as n1,
        CASE WHEN currval('q')=1 THEN fechanacimiento END as f1,
        CASE WHEN currval('q')=2 THEN nombrehijo END as n2 ,
        CASE WHEN currval('q')=2 THEN fechanacimiento END as f2 ,
        CASE WHEN currval('q')=3 THEN nombrehijo END as n3 ,
        CASE WHEN currval('q')=3 THEN fechanacimiento  END as f3,
        CASE WHEN currval('q')=4 THEN nombrehijo END as n4 ,
        CASE WHEN currval('q')=4 THEN fechanacimiento  END as f4 
        FROM pit_adq_hijo
        WHERE adquirientepadre = $1) 
    AS consulta) AS children,

    (SELECT 
        MAX(consulta.nomapeacc1) as nombreapellidoacc1,
        MAX(consulta.identacc1) as idacc1, 
        MAX(consulta.tipoid1) as tipoidacc1,
        MAX(consulta.nomapeacc2) as nombreapellidoacc2,
        MAX(consulta.identacc2) as idacc2, 
        MAX(consulta.tipoid2) as tipoidacc2,
        MAX(consulta.nomapeacc3) as nombreapellidoacc3,
        MAX(consulta.identacc3) as idacc3,
        MAX(consulta.tipoid3) as tipoidacc3,
        MAX(consulta.nomapeacc4) as nombreapellidoacc4,
        MAX(consulta.identacc4) as idacc4,
        MAX(consulta.tipoid4) as tipoidacc4,
        MAX(consulta.nomapeacc5) as nombreapellidoacc5,
        MAX(consulta.identacc5) as idacc5,
        MAX(consulta.tipoid5) as tipoidacc5
    FROM (SELECT codigo_adquiriente, nextval('p') as consecutivo,
        CASE WHEN currval('p')=1 THEN nombre_apellidos END as nomapeacc1,
        CASE WHEN currval('p')=1 THEN identificacion END as identacc1,
        CASE WHEN currval('p')=1 THEN tipo_identificacion END as tipoid1 ,
        CASE WHEN currval('p')=2 THEN nombre_apellidos END as nomapeacc2,
        CASE WHEN currval('p')=2 THEN identificacion END as identacc2,
        CASE WHEN currval('p')=2 THEN tipo_identificacion END as tipoid2 ,
        CASE WHEN currval('p')=3 THEN nombre_apellidos END as nomapeacc3,
        CASE WHEN currval('p')=3 THEN identificacion END as identacc3,
        CASE WHEN currval('p')=3 THEN tipo_identificacion END as tipoid3 ,
        CASE WHEN currval('p')=4 THEN nombre_apellidos END as nomapeacc4,
        CASE WHEN currval('p')=4 THEN identificacion END as identacc4,
        CASE WHEN currval('p')=4 THEN tipo_identificacion END as tipoid4 ,
        CASE WHEN currval('p')=5 THEN nombre_apellidos END as nomapeacc5,
        CASE WHEN currval('p')=5 THEN identificacion END as identacc5,
        CASE WHEN currval('p')=5 THEN tipo_identificacion END as tipoid5 

        FROM pit_people
        WHERE codigo_adquiriente = $1)
    AS consulta) AS people,

    (SELECT 
        MAX(consulta.entfin1) as entidadreff1, 
        MAX(consulta.prod1) as productoreff1, 
        MAX(consulta.num1) as numeroreff1, 
        MAX(consulta.suc1) as sucursalreff1,

        MAX(consulta.entfin2) as entidadreff2, 
        MAX(consulta.prod2) as productoreff2, 
        MAX(consulta.num2) as numeroreff2, 
        MAX(consulta.suc2) as sucursalreff2
    FROM (SELECT codigo_adquiriente, nextval('r') as consecutive,
        CASE WHEN currval('r')=1 THEN entity END as entfin1,
        CASE WHEN currval('r')=1 THEN something END as prod1,
        CASE WHEN currval('r')=1 THEN number_something END as num1 ,
        CASE WHEN currval('r')=1 THEN place_thing END as suc1 ,
        CASE WHEN currval('r')=2 THEN entity END as entfin2,
        CASE WHEN currval('r')=2 THEN something  END as prod2,
        CASE WHEN currval('r')=2 THEN number_something END as num2 ,
        CASE WHEN currval('r')=2 THEN place_thing END as suc2 
        FROM pit_money
        WHERE codigo_adquiriente = $1) 
    AS consulta) AS reffinancieras
WHERE a.consecutive = $1
$$ LANGUAGE SQL;

1 Ответ

1 голос
/ 24 апреля 2010

Как правило, я буду использовать массивы и generate_series для подобных вещей.

SELECT CASE WHEN i=1 THEN nombre_apellidos END as nomapeacc1, ...
FROM pit_people p
CROSS JOIN generate_series(1,5) s(i)

Но я думаю, что вы действительно хотите сделать кросс-таблицу.http://www.postgresql.org/docs/8.3/static/tablefunc.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...