sql - 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
。
解决方案
在 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);
...
推荐阅读
- office365 - Office 加载项 - 获取 PowerPoint 中的幻灯片数量
- perl - 在 wxperl 中捕获关键事件
- javascript - 检查类型对象或对象数组的道具的更改(React Hooks)
- node.js - 未验证在邮递员中上传文件的扩展名
- c - 一次尝试后如何停止循环?
- visual-studio-code - .gitignore 没有出现在 VScode 的文件资源管理器中
- javascript - 如何使用jquery获取每个表的单元格
- antlr4 - ANTLR4:逗号未检测为 unicode char
- node.js - 在 Firebase 函数上运行 mocha 时出现问题
- c# - 从数组播放音频 - Unity