plpgsql EXECUTE语句中的嵌套引号

plpgsql EXECUTE语句中的嵌套引号,sql,postgresql,plpgsql,literals,Sql,Postgresql,Plpgsql,Literals,我正在编写以表名为参数的plpgsql函数来处理postgis数据库更新任务,但在EXECUTE语句中遇到引号问题 下面是简单的SQL脚本,它工作正常: UPDATE baoluo SET sfzgjsyd='同时落在总规建设用地内外' FROM lu_plan AS lu WHERE ST_Overlaps(lu.geom, baoluo.geom) AND lu.is_construc = '建设用地' 在plpgsql中,我对汉字使用了

我正在编写以表名为参数的
plpgsql
函数来处理postgis数据库更新任务,但在
EXECUTE
语句中遇到引号问题

下面是简单的SQL脚本,它工作正常:

UPDATE baoluo SET sfzgjsyd='同时落在总规建设用地内外' 
        FROM lu_plan AS lu
        WHERE ST_Overlaps(lu.geom, baoluo.geom) 
        AND lu.is_construc = '建设用地'
在plpgsql中,我对汉字使用了双引号,下面是代码的相关部分:

CREATE or replace FUNCTION process(_tb1 regclass, town_name TEXT, town_id TEXT) 
RETURNS VOID AS
$func$
DECLARE
   city_name text := '文昌市';  -- assign at declaration
   city_code text := '469005';
BEGIN
    --更新字段:
    EXECUTE format('
        UPDATE %s SET sfzgjsyd="同时落在总规建设用地内外" 
        FROM lu_plan 
        WHERE ST_Overlaps(lu_plan.geom, %s.geom) 
        AND lu_plan.is_construc = "建设用地"', _tb1, _tb1); 
END; 
$func$
LANGUAGE plpgsql;
select process('public.baoluo', '保罗镇', '469005000');
我希望它工作正常,但日志显示错误,该字段不存在

在format()字符串中,单引号将导致汉字错误

嵌套引号存在问题,而不是汉字。对标识符使用美元报价和
%I

...
EXECUTE format($ex$
    UPDATE %I SET sfzgjsyd= '同时落在总规建设用地内外'
    FROM lu_plan 
    WHERE ST_Overlaps(lu_plan.geom, %I.geom) 
    AND lu_plan.is_construc = '建设用地'
    $ex$, _tb1, _tb1); 
...

我还尝试了@muistooshort建议的双引号,效果很好

...
EXECUTE format('
    UPDATE %I SET sfzgjsyd=''同时落在总规建设用地内外'' 
    FROM lu_plan 
    WHERE ST_Overlaps(lu_plan.geom, %I.geom) 
    AND lu_plan.is_construc = ''建设用地''', _tb1, _tb1); 
...

标准SQL(和PostgreSQL)对字符串文本使用单引号(例如
文昌市')和标识符的双引号(如表名和列名)。所以
”同时落在总规建设用地内外"
“建设用地“
被解释为列名,您需要对这些列名使用单引号,或者让
format
处理引号并将其作为参数提供。@muistooshort,但在
format()中)
strings,single quotes会使汉字出错;我不想使用参数,因为我的整个plpgsql函数中需要很多这样的参数,还有其他建议吗?作者:Deyu Tian
format('%1','建设用地')按预期工作并产生
'建设用地'
。此外,您应该使用
%I
而不是
%s
作为表名。如果出于某种原因使用
%L
是一个问题,那么您可以将单引号加倍以转义它们,就像在任何其他字符串文字中一样(即
sfzgjsyd=''同时落在总规建设用地内外'')。