首页 > 解决方案 > plpgsql EXECUTE 语句中的嵌套引号

问题描述

我正在编写以表名作为参数的函数来处理我的 postgis 数据库更新任务,但遇到了关于语句plpgsql中引号中的引号的问题。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

标签: sqlpostgresqlplpgsqlliterals

解决方案


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

推荐阅读