вложенные кавычки в операторе plpgsql EXECUTE - PullRequest
0 голосов
/ 17 января 2019

Я пишу 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.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Я также пытался с @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); 
...
0 голосов
/ 17 января 2019

В строках формата () одинарные кавычки будут ошибаться с китайскими символами.

Существует проблема с вложенными кавычками, а не с китайскими иероглифами. Используйте кавычки и %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); 
...
...