Postgresql函数动态表quote_ident错误

时间:2017-03-01 08:36:27

标签: postgresql plpgsql

我创建了一个动态函数。我动态地获得了表名的一部分。该功能已成功创建。但是当我执行该功能时。我收到一个错误。我怎么解决这个问题?我用

调用函数
select * from dwgcould.getlatlngcenter(2000653);


CREATE OR REPLACE FUNCTION dwgcould.getlatlngcenter(IN pro_id integer,
    OUT lat_center double precision, OUT lng_center double precision)
AS $$

BEGIN
      EXECUTE 'SELECT st_x(st_centroid( st_transform(geom,4326))) as lng_center  ,st_y(st_centroid( st_transform(geom,4326))) as lat_center
        FROM dwgcould.adpes_v1_' || quote_ident(pro_id) || '_line limit 1';
END;
$$ LANGUAGE plpgsql;

错误代码是

  

错误:函数quote_ident(整数)不存在   第2行:FROM dwgcould.adpes_v1_'|| quote_ident(pro_id)|| '_线...                                          ^   提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。   QUERY:选择'SELECT st_x(st_centroid(st_transform(geom,4326)))作为lng_center,st_y(st_centroid(st_transform(geom,4326)))作为lat_center               来自dwgcould.adpes_v1_'|| quote_ident(pro_id)|| '_line limit 1'   语境:PL / pgSQL函数dwgcould.getlatlngcenter(整数)第4行EXECUTE语句   **********错误**********   错误:函数quote_ident(整数)不存在   SQL状态:42883   提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。   上下文:PL / pgSQL函数dwgcould.getlatlngcenter(整数)第4行EXECUTE语句

另外,我如何检查表格是否存在?

1 个答案:

答案 0 :(得分:0)

更好地使用格式,例如:

CREATE OR REPLACE FUNCTION dwgcould.getlatlngcenter(IN pro_id integer,
    OUT lat_center double precision, OUT lng_center double precision)
AS $$

BEGIN
  if (select count(1) from pg_tables where tablename = format('adpes_v1_%s_line',pro_id)) < 1 then
    raise info '%','NO SUCH TABLE!';
    return;
  end if;
  EXECUTE format('SELECT * FROM dwgcould.adpes_v1_%s_line limit 1',pro_id) into lat_center,lng_center;
  return;
END;
$$ LANGUAGE plpgsql;

docs