检查记录是否存在postgres功能

时间:2018-05-29 15:37:59

标签: postgresql plpgsql

我正在尝试创建一个函数,该函数将确定我们的应用程序开发人员是否存在记录以帮助简化操作。

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 :(得分:1)

另外,你的动态字符串很糟糕,更好用:

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