2010-04-23 31 views
1

我有這個問題在任何PostgreSQL 8.3版本或8.4:如何使用溫度序列創建一個SQL函數和SELECT上PostgreSQL8

我創建了一個腳本,(重新)創建三個溫度序列,然後使用它們轉置一些表以獲得單行。

現在我希望把它在返回已經創建了一個類型的函數(我已經做了選擇進入,然後我把從創建的表中的字段來構建自定義類型)。這裏是腳本...問題是,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; 
+0

什麼是 「PostgreSQL8」?版本8.0或8.1或8.2或8.3或8.4?這些都是不同的版本。 plpgsql可能是一種更好的語言,sql是有限的。 – 2010-04-23 13:39:29

+0

添加了所需的信息。還有,我可以在plpgsql中刪除和創建序列嗎? – Alfabravo 2010-04-23 13:48:03

+1

是的,你可以,沒問題。只需在程序中使用EXECUTE即可。 – 2010-04-23 13:56:28

回答

1

通常我會使用數組和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

+0

這混亂的代碼是爲了在一排由一個人獲取信息。這包括從相關表中轉置一些行(從孩子中取N行並將其放在用戶的信息之外)。 但是好了,我覺得我太累了,繼續這樣,我會攻擊其他方式的問題。 – Alfabravo 2010-04-23 21:12:19

+0

是的,我知道你在做什麼。 generate_series()將允許您擺脫臨時序列,因此您可以創建視圖而不是使用過程。我給你的鏈接完全是你想要做的事情。 – 2010-04-26 15:23:16

+0

忘記檢查被接受的內容。這件事情起作用,然後...... – Alfabravo 2010-04-27 16:48:26

相關問題