2016-06-22 2 views
0

Возможно ли создать представление с параметром в PostgreSQL?SQL View с параметром в PostgreSQL, лучший способ предотвратить ошибку 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` 

Есть ли альтернатива, кроме чтения сессия:

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; 

проблема с переменным сеансом будет по-прежнему есть ошибка, что-то вроде: ERROR: unrecognized configuration parameter "bla_bytype._type" если программист забыл установить переменный сеанс.

Или с помощью хранимой процедуры:

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, один в RETURNS), мы также должны объявить типы данных ,

Есть ли альтернативные/более короткие решения, кроме этих двух? что-то вроде этого, может быть:

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

функция попробовать? ..

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');