2013-08-30 49 views
1

我需要幫助在我的plpgsql中,必須返回一個具有動態列的臨時表,我該如何做到這一點? 作爲列的名稱可能不同,我不知道如何才能完成此過程 對不起,谷歌翻譯:d如何返回SELECT *在我的plpgsql

CREATE OR REPLACE FUNCTION getreport(reportid INTEGER, userId VARCHAR) 
RETURNS SETOF RECORD AS 
$$ 
    DECLARE 
     recordResultadoFinal RECORD;    
     recordResultadoNomeEspecificos RECORD;  
     varGetSqlRelatorio VARCHAR;   
     varAreaId queryreports.f_area%TYPE; 
     varClientId queryreports.f_client%TYPE; 
     varTableNameTemp VARCHAR := 'temp'||userId; 
     varSqlAlterTable VARCHAR := ''; 
     varSqlUpdateTemp VARCHAR := ''; 
     varNomeColunaSpecificData VARCHAR := ''; 
    BEGIN 
     SELECT f_sql,f_area,f_client INTO varGetSqlRelatorio,varAreaId,varClientId FROM queryreports WHERE f_id = reportid; 
     EXECUTE 'DROP TABLE IF EXISTS '||varTableNameTemp; 
     EXECUTE 'CREATE TEMP TABLE '||varTableNameTemp||' AS '||varGetSqlRelatorio; 
     EXECUTE 'CREATE INDEX processid_idx ON '||varTableNameTemp||' USING btree (processid)'; 
     FOR recordResultadoNomeEspecificos IN EXECUTE ' 
           SELECT DISTINCT cs.f_id as idcoluna, cs.f_name as nomecoluna, cs.f_type as tipodado 
           FROM clientspecifics cs 
           INNER JOIN clientspecificdatas csd ON (cs.f_id = csd.f_clientspecific AND csd.f_process IN (SELECT processid FROM '||varTableNameTemp||')) 
           ORDER BY 2 
            ' 
     LOOP 
      varSqlAlterTable := varSqlAlterTable||' ALTER TABLE '||varTableNameTemp||' ADD COLUMN specific_'||recordResultadoNomeEspecificos.idcoluna||' varchar;'; 

      IF (recordResultadoNomeEspecificos.tipodado = 1) THEN varNomeColunaSpecificData := 'f_text'; 
      ELSIF (recordResultadoNomeEspecificos.tipodado = 2) THEN varNomeColunaSpecificData := 'f_name'; 
      ELSIF (recordResultadoNomeEspecificos.tipodado = 3) THEN varNomeColunaSpecificData := 'f_date'; 
      ELSIF (recordResultadoNomeEspecificos.tipodado = 4) THEN varNomeColunaSpecificData := 'f_value'; 
      ELSIF (recordResultadoNomeEspecificos.tipodado = 5) THEN varNomeColunaSpecificData := 'f_text'; 
      END IF; 
      varSqlUpdateTemp := varSqlUpdateTemp||' UPDATE '||varTableNameTemp||' SET specific_'||recordResultadoNomeEspecificos.idcoluna||' = csd.'||varNomeColunaSpecificData||' 
           FROM clientspecificdatas csd 
           WHERE csd.f_process = processid 
           AND csd.f_clientspecific = '||recordResultadoNomeEspecificos.idcoluna||';'; 


     END LOOP; 
     EXECUTE varSqlAlterTable; 
     EXECUTE varSqlUpdateTemp; 
     RETURN QUERY EXECUTE 'SELECT * FROM '||varTableNameTemp; 
    END; 
$$ LANGUAGE 'plpgsql'; 
+0

據一個我知道,這是不可能在PostgreSQL中,直到您從功能 –

+0

在做選擇時指定的列如果你確定哪些數據將被退回,你可以設置一個臨時表中的功能 - 'CREATE OR REPLACE FUNCTION getreport(reportid INTEGER,userId VARCHAR)RETURNS TABLE(column1 integer,column2 integer etc ...' – Lucas

+0

_must返回一個具有動態columns_的臨時表:這就是你的函數所做的事情,你應該告訴因爲這是真正發生的地方 –

回答

0

您有幾種選擇:

  1. 您可以返回一個指針然後從中獲取。這隻適用於交易。
  2. 您可以返回一個xml文檔,然後在您的應用程序中處理該文檔
  3. 您可以返回JSON或HSTORE。
  4. 您可以返回setof記錄並在函數聲明中指定列列表,但這是醜陋而脆弱的。

問題是PostgreSQL在規劃查詢時需要知道返回類型。這意味着你不能擁有鋸齒狀的行或動態的行數。這些必須包裝在規劃師可以容納的東西中。