Postgres函数在RETURN QUERY中传递表引用和字符串



我正试图为pg_featureserv API编写一个Postgres函数(pg_featureerv函数教程(,但不知道如何设置它。目前的功能如下:

CREATE OR REPLACE FUNCTION postgisftw.webid( 
webid_input text DEFAULT '8bacb710-4f3c-11eb-a8dd-48df37d0ac38_112000063',
table_name text DEFAULT 'dz_earthquake_web_00078125_to_05',
schema_name text DEFAULT 'emea_mea_naf'
)
RETURNS TABLE(webid text, geom geometry) 
AS $$ 
BEGIN 
RETURN QUERY 
EXECUTE
format('SELECT i.webid::text,
i.geom 
FROM %I.%I as i
WHERE i.webid = %I;', schema_name, table_name, web_input);
END; 
$$ 
LANGUAGE 'plpgsql' STABLE PARALLEL SAFE; 
SELECT postgisftw.webid();

函数应该使用输入返回一个带有webid和几何体的记录:schema和表名以及webid。然而,我得到了一个错误:

ERROR:  column "web_input" does not exist
LINE 4: ...HERE i.webid ILIKE %I;', schema_name, table_name, web_input)
^
QUERY:  SELECT format('SELECT i.webid::text,
i.geom 
FROM %I.%I as i
WHERE i.webid = %I;', schema_name, table_name, web_input)
CONTEXT:  PL/pgSQL function postgisftw.webid(text,text,text) line 3 at RETURN QUERY
SQL state: 42703

我试过在web_input周围使用各种引号,但很难。你能给我一个提示吗?

%I用于创建查询的schema.tablename部分的标识符。查询的这一部分WHERE i.webid = %I正在查找数据值,而不是标识符。您需要使用%L。此外,正如@Chris所指出的,您对该值使用了错误的变量。

最新更新