2016-06-22 8 views
0

PostgreSQLでパラメータ付きビューを作成することはできますか?PostgreSQLのパラメータ付きSQLビュー、実行時にSQLエラーを防ぐ最も良い方法は?

私たちのバックエンドサービスで内部サーバーエラーの原因となる未確認のSQL構文がある可能性があります。そのため、すべてのクエリをビューに変換する必要がありますか?このような

何か:

query := ` -- 
    func Bla_ByType 
SELECT id 
    , data 
    - 
    >> 
    'name' 
FROM bla 
WHERE data->>'type' = ` + escapeAndQuote(param1) 

構文それは単なる文字列なので、エラーとして検出されない上には、正しいものは次のようになります。

query := ` -- func Bla_ByType 
SELECT id 
    , data->>'name' 
FROM bla 
WHERE data->>'type' = ` + escapeAndQuote(param1) 

単純なクエリ上記の例で、他の次のようなものです:

WITH t AS (
    SELECT ... 
    FROM 
    WHERE param1 
) SELECT ... 
FROM ... 
LEFT JOIN t 
WHERE param2` 

読書以外の方法はありますか?プログラマは、セッション変数を設定するのを忘れた場合ERROR: unrecognized configuration parameter "bla_bytype._type":セッションは:

CREATE OR REPLACE VIEW v_bla_bytype AS 
SELECT id 
    , data->>'name' 
FROM bla 
WHERE data->>'type' = CAST(current_setting('bla_bytype._type') as TEXT) 

SET bla_bytype._type = 'test'; 
SELECT * FROM v_bla_bytype; 

セッション変数の問題はまだエラー、のようなものを持っているでしょう。

またはストアドプロシージャ使用してストアドプロシージャに問題

CREATE OR REPLACE FUNCTION p_bla_bytype(_type text) 
RETURNS TABLE (id bigint, name text) AS $$ 
    SELECT id 
    , data->>'name' 
    FROM bla 
    WHERE data->>'type' = $1 
$$ LANGUAGE sql; 
-- i don't know hot to use "_type" by name not using number ($1) 

SELECT * FROM p_bla_bytype('test'); 

を列名が2回(SELECTで1、RETURNS中1)を入力する必要があり、我々はまた、データ型を宣言する必要がありました。

2つ以外の代替/短所がありますか?

CREATE OR REPLACE PARAMETERIZED VIEW pv_bla_bytype(_type TEXT) AS 
    SELECT id 
    , data->>'name' "name" 
    FROM bla 
    WHERE data->>'type' = $_type 
; 

SELECT * FROM pv_bla_bytype('test'); 

ソリューションが必要です:多分このような何か

  • を良好なパフォーマンス
  • SQL構文はあまり

PostgreSQLのようなソリューションがありますを入力しない

  • を検証しました?

  • +1

    。あなたはそれらをテストする必要があります。 – Bill

    +0

    なぜ機能を使用しないのですか? http://stackoverflow.com/q/11401749/330315 –

    +0

    投稿されているので、どこにも問題が生じていないようです。本当の問題は何ですか? –

    答えて

    0

    try関数?..あなたは、構文エラーを回避するために、ビューにクエリを変換する必要はありません

    CREATE OR REPLACE function pv_bla_bytype(_type TEXT) returns table (id bigint, name text) AS 
    $F$ 
    declare 
    begin 
    return query 
        SELECT bla.id 
        , data->>'name' "name" 
        FROM bla 
        WHERE data->>'type' = _type 
    ; 
    end; 
    $F$ 
    language plpgsql 
    ; 
    SELECT * FROM pv_bla_bytype('test'); 
    
    関連する問題