Postgresql 如何在我的plpgsql中返回SELECT*
我需要plpgsql中的帮助,必须返回一个具有动态列的临时表,我如何才能做到这一点? 由于列的名称可能不同,我不知道如何完成此过程 对不起,谷歌翻译:DPostgresql 如何在我的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
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';
您有几个选择:
问题在于,在规划查询时,PostgreSQL需要知道返回类型。这意味着您不能有锯齿状的行或动态的行数。这些必须被包装在规划器可以容纳的东西中。据我所知,在PostgreSQL中是不可能的,除非在执行“从函数中选择”时指定列。如果确定将返回哪些数据,可以在函数中设置临时表-
创建或替换函数getreport(reportid INTEGER,userId VARCHAR)返回表(column1 integer、column2 integer等)。
必须返回一个包含动态列的临时表:这是您的函数已经做过的。您应该告诉调用的上下文,因为这是它真正发生的地方。问题仍然不清楚。相关的问题可能有帮助。