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 Tianformat('%1','建设用地')代码>按预期工作并产生'建设用地'
。此外,您应该使用%I
而不是%s
作为表名。如果出于某种原因使用%L
是一个问题,那么您可以将单引号加倍以转义它们,就像在任何其他字符串文字中一样(即sfzgjsyd=''同时落在总规建设用地内外''代码>)。