plpgsql EXECUTE语句中的嵌套引号

时间:2019-01-17 02:46:13

标签: 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中,我用双引号表示汉字,这是代码的相关部分:

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');

我希望它能正常工作,但是日志显示the field not exists错误。

2 个答案:

答案 0 :(得分:2)

  

在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); 
...

答案 1 :(得分:0)

我还尝试了使用@muistooshort建议将双引号加倍,这很好。

runtime