Det kunne fungere sådan her:
CREATE OR REPLACE FUNCTION tt_query(orig_name regclass, data_tt timestamp)
RETURNS SETOF record AS
$func$
BEGIN
EXECUTE 'CREATE OR REPLACE TEMP VIEW tmp as
select *
from '
|| orig_name
|| ' where trigger_changed >'
|| quote_literal(data_tt)
|| ' ORDER BY trigger_changed DESC';
-- other work on view tmp
-- return the rows of view temp
RETURN QUERY
SELECT * FROM tmp;
END
$func$ LANGUAGE plpgsql;
-
Bemærk brugen af objektidentifikatortypen
regclass
for automatisk at undgå SQL-injektion. -
Brug ikke den forældede syntaks
var ALIAS for $1
hvis du ikke skal. Angiv parameternavne i stedet. -
Jeg ville ikke bruge søgeordet
temp
som identifikator, selvom det er tilladt. Brug aftmp
i stedet. -
Brug
RETURN QUERY
for at returnere et sæt poster. Dette kan endda være et statisk opkald udenEXECUTE
. Du returnerer dog anonyme poster og Postgres kræver en liste over kolonnedefinitioner med hvert opkald:
SELECT * FROM tt_query('tbl_name', '2014-02-15 12:00')
AS f(col1 int, col2 text, ...);
Det er ret uhåndterligt.
Bedre løsninger
Hvis du ved det returtypen (selvom tabelnavne ændrer sig, kan listen over kolonner dele de samme typer), erklærer den ved oprettelsestidspunktet. Overvej dette relaterede spørgsmål:
PostgreSQL:FEJL:42601:Der kræves en kolonnedefinitionsliste for funktioner, der returnerer "record"
Hvis returtypen varierer med det angivne tabelnavn er der stadig en meget bedre løsning. Da du opretter en visning med SELECT * FROM tbl
, kan du bruge den velkendte type af selve tabellen som polymorf
parameter:
CREATE OR REPLACE FUNCTION tt_query(orig_name anyelement, data_tt timestamp)
RETURNS SETOF anyelement AS
$func$
BEGIN
EXECUTE format('CREATE OR REPLACE TEMP VIEW tmp AS
SELECT * FROM %s
WHERE trigger_changed > %L
ORDER BY trigger_changed DESC'
,pg_typeof(orig_name)
,data_tt);
-- other work on view tmp
-- return the rows of view tmp
RETURN QUERY
SELECT * FROM tmp;
END
$func$ LANGUAGE plpgsql;
Forenklet opkald:
SELECT * FROM tt_query(NULL::tbl_name, '2014-02-15 12:00');
Bruger også format()
for sikker og enkel strengsammenkædning.
Flere detaljer i dette relaterede svar:
Refactor en PL/pgSQL-funktion for at returnere output fra forskellige SELECT-forespørgsler