복붙노트

[SQL] 동적 파일 이름으로 복사

SQL

동적 파일 이름으로 복사

나는 테이블에로드 CSV 데이터로 함수를 작성하는 것을 시도하고있다. I는 입력 인수는 파일의 경로가되고 싶어요.

CREATE OR REPLACE FUNCTION public.loaddata(filepathname varchar)
  RETURNS void AS
$BODY$
BEGIN
COPY climatedata(
    climatestationid, 
    date,
    prcp,
    prcpqflag,
    prcpmflag,
    prcpsflag,
    tmax,
    tmaxqflag,
    tmaxmflag,
    tmaxsflag,
    tmin,
    tminqflag,
    tminmflag,
    tminsflag)
  FROM $1
  WITH csv header;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.filltmaxa(character varying)
  OWNER TO postgres;

내가 얻을이 기능을 만들려고 할 때

그 잘못은 무엇입니까?

해결법

  1. ==============================

    1.당신은 동적 SQL이 필요합니다 :

    당신은 동적 SQL이 필요합니다 :

    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;
    

    형식은 () PostgreSQL을 9.1+가 필요합니다. (탈출) 작은 따옴표의 별도의 설정없이 파일 이름을 전달합니다

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

    %의 L과 형식은 () 안전하게 파일 이름을 이스케이프합니다. 그것없이 SQL 주입에 취약하다.

    이외에도, 당신은 함수 이름 불일치가 :

    CREATE OR REPLACE FUNCTION의 public.loaddata (filepathname의 VARCHAR) ... ALTER 기능의 public.filltmaxa (문자 VARYING)

  2. from https://stackoverflow.com/questions/16019508/copy-with-dynamic-file-name by cc-by-sa and MIT license