sql >> Database >  >> RDS >> PostgreSQL

KOPIE met dynamische bestandsnaam

Je hebt dynamische SQL nodig :

CREATE OR REPLACE FUNCTION loaddata(filepathname text)
  RETURNS void AS
$func$
BEGIN
   EXECUTE format ('
   COPY climatedata(
         climatestationid
       , date
         ... -- more columns 
       , tminsflag)
   FROM %L (FORMAT CSV, HEADER)'  -- current syntax
           -- WITH CSV HEADER'    -- tolerated legacy syntax
   , $1);  -- pass function parameter filepathname to format() 
END
$func$ LANGUAGE plpgsql;

format() vereist PostgreSQL 9.1+.
Geef de bestandsnaam door zonder een extra set (escaped) enkele aanhalingstekens:

SELECT loaddata('/absolute/path/to/my/file.csv')

format() met %L ontsnapt veilig aan de bestandsnaam. Zou gevoelig zijn voor SQL-injectie zonder het.

Terzijde , je hebt een functienaam die niet overeenkomt:

CREATE OR REPLACE FUNCTION public.loaddata(filepathname varchar)
...
ALTER FUNCTION public.filltmaxa(character varying)



  1. Oracle SQL - Hoe de hoogste 5 waarden van een kolom op te halen

  2. Ondersteunt PostgreSQL accentongevoelige sorteringen?

  3. Opnieuw ordenen/reset auto increment primaire sleutel

  4. Dynamisch doorgeven van kolomnamen voor een recordvariabele in PostgreSQL