2017-09-25 3 views
0

많은 게시물을 보았지만 내 상황에 적절한 대답을 찾을 수 없었습니다. PostGIS 2.3 확장을 사용합니다. 당신은 내가 변수 내가 사용하고 있지 않다 "geometrie"이 볼 수 있듯이 나는 실패, 내가 사용하고자하는 데이터를 포함하는 변수를 선언하려하기 때문에, 그것이PostgreSQL 9.5 : 테이블 "new"에 대한 FROM 절 항목이 누락되었습니다

CREATE OR REPLACE FUNCTION public.split_cable() 
    RETURNS trigger AS 
$BODY$ 
DECLARE geometrie geometry; 
BEGIN  
geometrie = new.geom;  
create view temp_wire as (
    with brs as (select boite.geom from cablage_pays_gex.boite 
    where st_intersects(boite.geom, new.geom) and boite.geom not in (select st_startpoint(st_linemerge(new.geom))) and boite.geom not in (select st_endpoint(st_linemerge(new.geom))) 
    ) 
    select st_dump(st_split(new.geom, brs.geom)) from brs 
    ); 
RETURN new; 
END 
$BODY$ 
    LANGUAGE plpgsql VOLATILE; 

: 여기 내 코드입니다. 내가 얻는 오류는 내 질문에 제목을 붙이고, st_intersects() 함수를 가리키고있다. 그래서 처음 new.geom을 호출하려고한다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 어떻게 해결할 수 있을까요? 동적 SQL 문CREATE VIEW 요구된다;

EDIT는 : DR

CREATE TABLE public.cable2 
(
    id_cable integer NOT NULL DEFAULT nextval('cable2_seq'::regclass), 
    geom geometry(MultiLineString,2154), 
    CONSTRAINT cable2_pkey PRIMARY KEY (id_cable) 
); 
+0

트리거 테이블에 대한'create table' 문을 보여주십시오. 그러나 트리거에서 뷰를 생성하는 것은 ** 정말 ** 나쁜 생각입니다. 기본 테이블에서 두 번째 DML 문 다음에 실패합니다. 즉, DML 문은 한 번만 실행하면됩니다. 이후의 모든 문에 대해 오류가 발생하기 때문에 DML 문을 한 번 실행 한 다음 다시 실행할 수는 없습니다. –

+0

@a_horse_with_no_name 무슨 뜻인지 확실하지 않습니다. 나는 대부분 제 3 자 소프트웨어 인 QGIS를 사용하여 db와 상호 작용하므로 어떠한 명령문도 사용하지 않습니다. 'create trigger' 문을 의미합니까? –

+0

그런 다음 해당 테이블에 대한 첫 번째 DML 문 다음에 트리거가 실패하므로 해당 타사 소프트웨어가 작동을 멈 춥니 다. 트리거에 어떤 문제가 있는지 알아 보려면 트리거를 정의 할 테이블에 대한 create table 문을 봐야합니다. –

답변

1

TL : 여기되는 트리거 동작하는 테이블을 작성 문이다.

plpgsql에서 변수는 CREATE... 쿼리와 같은 데이터 정의 쿼리에서 보간되지 않습니다.

매개 변수는 매개 변수 또는 열 참조는 구문

그리고 DDL 쿼리에

허용되는 경우 장소에서 대체됩니다

, 장소 :

더 일반적으로 plpgsql documentation가로 알려줍니다 허용되는 범위는 다음과 같습니다. nowhere.

쿼리의 new.geom 참조가 문자 그대로 사용되고 왜 임시 변수 geometrie으로 전송하면 더 좋게 작동하지 않을까요?

동적 SQL은 기본적으로 명령 문자열을 작성한 다음 해당 문자열을 EXECUTE과 같은 명령문으로 실행하는 것으로 구성됩니다. 생성 된 문자열에는 더 이상 변수에 대한 참조가 없어야합니다. 추가 정보 : Executing Dynamic Commands

메모와 마찬가지로 테이블에서 행이 영향을받을 때마다 영구보기를 만드는 것이 개념적 수준에서는 완전히 잘못된 것처럼 보입니다. 처음부터 왜 그렇게하고 싶은지 이해하기 어렵습니다.

+0

나는 뷰 생성에 대한 나쁜 생각을 알고 있습니다.제 아이디어는 트리거가 작동 할 각 INSERT에 대해 호출 할 뷰를 먼저 생성 한 다음 트랜잭션이 끝날 때이를 삭제하는 방식으로 많은 CTE를 피하는 것입니다. 그러나 실제로 다른 상황에서 동시 사용하는 경우에는 약간의 문제가 발생할 수 있습니다. 이제 2 단계 CTE (CTE 내부의 CTE)를 만드는 것이 더 좋은 생각입니까? –

+1

@GuiOmClair : 위의 대답은 트리거에 구문 오류가있는 이유입니다. Wether는 완전히 다른 질문처럼 보이는 중첩 된 CTE를 사용하는 것이 좋습니다. 다른 Q/A 슬롯에서 질문 할 수 있지만 위의 트리거 코드와는 완전히 다른 텍스트를 사용하는 것이 좋습니다. –