파티션 된 테이블에 대해 plpgsql에서 트리거 함수를 작성 중이며 모든 논리가 작동하지만 실제 레코드를 테이블에 삽입하는 데 문제가 있습니다.
변수 참조로 특정 테이블을 참조해야하므로 (내가 이해하는 한) 다음과 EXECUTE
같이 명령 을 사용해야합니다 .
EXECUTE 'INSERT INTO ' || tablename || ' VALUES ' || NEW.*;
그러나 이것은 NEW
Postgres의 INSERT
기능이 이해할 수 있는 방식으로 저장된 레코드의 압축 풀기를 처리하지 않습니다 . 내부에있는 모든 큰 따옴표를 유지하면서 레코드를 문자열로 변환합니다. 즉, 위의 내용은 실행시 다음과 같이 바뀝니다.
INSERT INTO cfs_hgt_05152016_05202016
VALUES ("2016-05-16 00:00:00","2016-05-12 06:00:00",HGT,"1000 mb",9,-71,-38.5371)
이것의 문제는 Postgres가 이러한 값이 이제 큰 따옴표로 인해 열이라고 생각한다는 것입니다.
COPY cfs_hgt_master, line 1: ""2016-05-16 00:00:00","2016-05-12 06:00:00","HGT","1000 mb",9,-71,-38.5371" ERROR: column "2016-05-16 00:00:00" does not exist
나는 이것을 다음과 같이 해결하려고 노력했다.
record_text := regexp_replace(NEW.*, '"', '\'', 'gi');
EXECUTE 'INSERT INTO ' || tablename || ' VALUES ' || record_text;
그러나 작은 따옴표를 이스케이프하면 오류가 발생합니다.
psql:cfs_hgt_trigger_function.sql:36: ERROR: unterminated quoted string at or near "' || record_text; LINE 30: ... EXECUTE 'INSERT INTO ' || tablename || ' VALUES ' || recor... ^
누군가가 작은 따옴표를 올바르게 이스케이프 처리하는 방법을 알아 내거나 내 작업을 수행하는 다른 방법을 제안 할 수 있습니까?
변환하지 마십시오 값을 자신의 텍스트 표현에 전혀 . 의 USING
절을EXECUTE
사용하여 값을 전달하십시오 .
그리고 테이블 이름을 올바르게 이스케이프하십시오. format()
이를 위해 사용할 수 있습니다 .
EXECUTE format('INSERT INTO %I SELECT $1.*', tablename)
USING NEW;
세부:
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다