我正在编写以表名作为参数的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
错误。
答案 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