2017-09-25 36 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を呼び出そうとしたとき)。私は間違って何をしていますか?そして私はこれをどのように解決することができますか?

EDIT:ここでトリガが演技しているcreate table文である:

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'ステートメントを教えてください。しかし、トリガーでビューを作成することは、本当に**本当に悪い考えです。それは、元のテーブルの2番目のDMLステートメントの後で失敗します。つまり、DML文は1度しか実行できず、その後も実行することはできません。これは、その後のすべての文でエラーが発生するためです。 –

+0

@a_horse_with_no_nameあなたが何を意味するのか分かりません。私は主にサードパーティのソフトウェアQGISを使用してdbとやりとりしていますので、私は文を使用していません。 'create trigger'文を意味しますか? –

+0

その後、そのテーブルに対する最初のDML文の後にトリガが失敗するため、サードパーティのソフトウェアが動作を停止します。あなたのトリガーに何が間違っているかを知るには、トリガーを定義しているテーブルの 'create table'ステートメントを見る必要があります。 –

答えて

1

TL; DR:動的SQLCREATE VIEW文のために必要です。

plpgsqlの変数は、 CREATE...クエリのようなデータ定義クエリでは補間されません。

より一般的には、plpgsqlがdocumentationのようにそれを伝えます:

パラメータのみ、パラメータまたは 列参照が文法的に

そして、DDLクエリで許可されている場所で場所を代入します許可されるのは:nowhereです。

クエリ内のnew.geom参照が文字通り取られていて、なぜそれを一時変数geometrieに転送しても、それはうまく動作しません。

動的SQLは、基本的にコマンド文字列を作成し、その文字列をEXECUTEの文として実行することから成ります。その文字列は、いったん生成されると、もはや変数への参照を含まなくてはなりません。 詳細情報:Executing Dynamic Commands

コメントと同じように、行がテーブル内で影響を受けるたびに常時ビューを作成することは、概念レベルでは完全に間違っているようです。最初にそれをやりたい理由を理解するのは難しいです。

+0

私はビュー作成の悪い考えを理解しています。私の考えでは、最初にトリガーが動作する各INSERTを呼び出すビューを作成し、トランザクションの最後にドロップするビューを作成して、多くのCTEを回避します。しかし実際には、他の状況の中で同時に使用する場合には何らかの問題を引き起こす可能性があります。だから今、2段階のCTE(CTE内のCTE)を作成することをお勧めしますか? –

+1

@ GuiOmClair:上記の答えは、トリガーに構文エラーがある理由です。あなたは入れ子になったCTEを使用することをお勧めします。異なるQ/Aスロットで質問するかもしれないが、上のトリガコードとは全く異なるテキストで質問する可能性があります。 –

関連する問題