Возможно ли создать представление с параметром в 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 ?
Вам не нужно конвертировать ваши запросы просмотров избежать синтаксических ошибок. Тебе нужно их протестировать. – Bill
Почему бы не использовать функцию? http://stackoverflow.com/q/11401749/330315 –
Поскольку он опубликован, похоже, что вы создали проблему из ниоткуда. В чем проблема? –