2016-04-28 10 views
0

このスニペットは、関数の一部であり、$ 1と$ 2と呼ばれる整数(およびID)と文字列(テーブル名)をindataとして取ります。最初の例では、関数が現在動作しているので、入力は(68, 'heat_arcs')になり、関数が機能します。しかし、異なるテーブルで動作するように関数を拡張する必要があるので、cost FROM heat_arcs'cost FROM ' || $2 ||'に変更できたと考えましたが、 "unterminated quoted string"のために構文エラーが発生します。パイプと文字列を結合する際の動作が一貫しない

文字列をクエリの後半部分では入力データと正常に結合できますが、初期部分では正常に結合できないのはなぜですか? pgr_trspは、最初と最後のパラメータ

電流の両方のための入力として文字列を要求します:

希望
FROM pgr_trsp(
       'SELECT gid as id, source, target, cost FROM heat_arcs', 
       r, 2, false, false, 'select 1000 as to_cost, b.target_id, a.via_path::text from 
    (select gid as target_id from '|| $2 ||' where source = ' || $1 ||' or target = ' || $1 ||') as b, 
    (select gid as via_path from '|| $2 ||' where source = ' || $1 ||' or target ='|| $1 ||') as a WHERE b.target_id <> a.via_path' 

FROM pgr_trsp(
       'SELECT gid as id, source, target, cost FROM '|| $2 ||', 
       r, 2, false, false, 'select 1000 as to_cost, b.target_id, a.via_path::text from 
    (select gid as target_id from '|| $2 ||' where source = ' || $1 ||' or target = ' || $1 ||') as b, 
    (select gid as via_path from '|| $2 ||' where source = ' || $1 ||' or target ='|| $1 ||') as a WHERE b.target_id <> a.via_path' 

答えて

0

あなたはこの1つ上の自分をキックするつもりだ:あなたが持っています迷惑な引用符!あなたの質問(とあなたのエディタ)の構文の強調表示は、あなたが注意深く見ればそれを放棄します。

我々は、文字列、カンマ、およびリテラルr持って作業バージョンでは:

:壊れたバージョンでは

'SELECT gid as id, source, target, cost FROM heat_arcs', r 

を、私たちはコンマとrを含む文字列を持っています

'SELECT gid as id, source, target, cost FROM '|| $2 ||', r 

連結を取り出す、それはです:

'SELECT gid as id, source, target, cost FROM heat_arcs, r 

だから、あなたが実際たかった:あなたは、動的SQLを作成していることから、あなたは本当に理想的な、quoting functions正しい(だけでなく、正気度チェックにホワイトリストに対して引数を使用してくださいする必要があること

'SELECT gid as id, source, target, cost FROM '|| $2, r 

注意):

'SELECT gid as id, source, target, cost FROM '|| quote_ident($2), r 
+0

多くの点で、IMSoP。私はあなたのアドバイスを受け取り、クォート関数をチェックアウトします:) – FHilding

関連する問題