plpgsql EXECUTE 语句中的嵌套引号
nested quotes in plpgsql EXECUTE statement
我正在用 table 名称作为参数编写 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
。
In format() strings, single quotes will get wrong with Chinese characters.
嵌套引号有问题,汉字没有问题。使用美元引号和 %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);
...
我正在用 table 名称作为参数编写 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
。
In format() strings, single quotes will get wrong with Chinese characters.
嵌套引号有问题,汉字没有问题。使用美元引号和 %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);
...