Проверьте, существует ли запись postgres функцией - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь создать функцию, которая будет определять, существует ли запись для разработчиков наших приложений, чтобы упростить задачу.

CREATE FUNCTION records_exist(schema_name VARCHAR(255), table_name VARCHAR(255), field_name VARCHAR(255), field_value VARCHAR(255))
  RETURNS BOOLEAN
LANGUAGE plpgsql
AS $$
DECLARE

    _schema_name ALIAS FOR $1;
  _table_name  ALIAS FOR $2;
  _field_name  ALIAS FOR $3;
  _field_value ALIAS FOR $4;
  _sql_string  VARCHAR(5000);
BEGIN
_sql_string= 'SELECT EXISTS(SELECT 1 FROM ' || _schema_name || '.' || _table_name || ' WHERE ' || _field_name || '=' || _field_value || ');';



    RETURN BOOLEAN EXECUTE _sql_string;
    --RETURN TABLE   EXECUTE _sql_string; doesn't work  
END
$$;

Следующее должно работать, но я продолжаю получать ERROR: syntax error at or near "EXECUTE"

Пожалуйста, дайте мне знать ошибку моих путей.

1 Ответ

0 голосов
/ 29 мая 2018

Кроме того, ваша динамическая строка плохая, лучше использовать:

select format('select exists from %I.%I where %I = %L',schema_name,table_name,field_name, field_value) into _sql_string;

Кроме того, вы понимаете, что ваш _field_value не проверяет тип данных? ..

Короче говоря,это может быть что-то похожее на:

db=# CREATE or replace FUNCTION records_exist(schema_name VARCHAR(255), table_name VARCHAR(255), field_name VARCHAR(255), field_value VARCHAR(255))
  RETURNS BOOLEAN
LANGUAGE plpgsql
AS $$
DECLARE
 _sql text;
 _b boolean;
BEGIN
 _sql := format('select exists (select null from %I.%I where %I = %L)',schema_name,table_name,field_name, field_value);
 execute _sql into _b;
 return _b;
END
$$;
CREATE FUNCTION
Time: 10.680 ms
db=# select * from records_exist('pg_catalog','pg_database','datname','postgres'); records_exist
---------------
 t
(1 row)

Time: 59.472 ms
...