[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.당신은 동적 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)
from https://stackoverflow.com/questions/16019508/copy-with-dynamic-file-name by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 갭 임계 값보다 차이가 큰 테이블과 동일한 필터의 다른 레코드로부터 값을 취득하기위한 쿼리 (0) | 2020.05.17 |
---|---|
[SQL] SQL0418N 오류 해결 방법 (0) | 2020.05.16 |
[SQL] SQL 함수 - 계승 (0) | 2020.05.16 |
[SQL] SQLSTATE는 [42S22] : 열을 찾을 수 없습니다 : 1054 알 수없는 열 - Laravel (0) | 2020.05.16 |
[SQL] 빈 SQL 테이블 퍼키이 있습니까? 모든 SQL 테이블합니까? (0) | 2020.05.16 |