Postgresql 如何在我的plpgsql中返回SELECT*

Postgresql 如何在我的plpgsql中返回SELECT*,postgresql,select,return,plpgsql,Postgresql,Select,Return,Plpgsql,我需要plpgsql中的帮助,必须返回一个具有动态列的临时表,我如何才能做到这一点? 由于列的名称可能不同,我不知道如何完成此过程 对不起,谷歌翻译:D CREATE OR REPLACE FUNCTION getreport(reportid INTEGER, userId VARCHAR) RETURNS SETOF RECORD AS $$ DECLARE recordResultadoFinal RECORD; recor

我需要plpgsql中的帮助,必须返回一个具有动态列的临时表,我如何才能做到这一点? 由于列的名称可能不同,我不知道如何完成此过程 对不起,谷歌翻译:D

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'; 

您有几个选择:

  • 您可以返回一个refcursor,然后从中提取。这只适用于事务
  • 您可以返回xml文档,然后在应用程序中处理该文档
  • 您可以返回JSON或HSTORE
  • 您可以返回一组记录并在函数声明中指定列列表,但这样做既丑陋又脆弱

  • 问题在于,在规划查询时,PostgreSQL需要知道返回类型。这意味着您不能有锯齿状的行或动态的行数。这些必须被包装在规划器可以容纳的东西中。

    据我所知,在PostgreSQL中是不可能的,除非在执行“从函数中选择”时指定列。如果确定将返回哪些数据,可以在函数中设置临时表-
    创建或替换函数getreport(reportid INTEGER,userId VARCHAR)返回表(column1 integer、column2 integer等)。
    必须返回一个包含动态列的临时表:这是您的函数已经做过的。您应该告诉调用的上下文,因为这是它真正发生的地方。问题仍然不清楚。相关的问题可能有帮助。