sql >> Database teknologi >  >> RDS >> PostgreSQL

plpgsql funktion:Returner rækker fra en visning oprettet fra tilfældig tabel

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 af tmp i stedet.

  • Brug RETURN QUERY for at returnere et sæt poster. Dette kan endda være et statisk opkald uden EXECUTE . 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




  1. Importer/eksporter database med SQL Server Server Management Studio

  2. MongoDB læse-/skrivelåse

  3. Fejl ved installation af MySQL-python med pip-installation i OSX, virtualenv

  4. Regulært udtryk find og erstat i Postgres