Связь параметра в динамическом SQL

Я хочу обновить ряд через Pl/pgSQL в PostgreSQL, но ошибка происходит. Это - мой код:

CREATE OR REPLACE FUNCTION "Surrogate_Del"(tablename text, surro uuid)
  RETURNS void AS
$BODY$DECLARE
tblname text;
surrogate uuid;
BEGIN
tblname:=tablename;
surrogate:=surro;
execute 'UPDATE'||tblname||'SET ID=NULL WHERE surrogate='||surrogate|| ;
END$BODY$
LANGUAGE plpgsql

Это - UUID, что я хочу обновить рекордную основу на нем

*syntax Error »ab7«
cd32cdf0-5ab7-11e2-abda-1c4bd605a98d
                  ^*

Как я могу решить эту проблему?

1
nl ja de
вы пропускаете места после обновления и, прежде чем установлено: ' ОБНОВЛЕНИЕ ' || tblname ||' НАБОР...
добавлено автор a_horse_with_no_name, источник
Это предназначается для повторного использования или одноразовой операции? Для специального использования рассмотрите a СДЕЛАТЬ команда.
добавлено автор Erwin Brandstetter, источник
Пожалуйста, включайте снова свой обновленный код и независимо от того, что новое сообщение об ошибке. Ваше обновление решит одну синтаксическую ошибку, и теперь у вас есть другой.
добавлено автор Andy Lester, источник
Я отредактировал свой вопрос, но ошибка остается
добавлено автор Kabi, источник

2 ответы

Вам нужны кавычки, которых избегают, вокруг параметра:

execute 'UPDATE ' || tblname || ' SET ID = NULL WHERE surrogate = ''' || surrogate || '''';

предложение mu более чистое и более прочное:

execute 'UPDATE ' || tblname || ' SET ID = NULL WHERE surrogate = ' || quote_literal(surrogate);

Если это - более новая версия postgresql (9.0 +, я предполагаю), можно использовать формат функция:

execute format('UPDATE %I SET ID = NULL WHERE surrogate = %L', tblname, surrogate);

%L escapes it as a SQL literal.

4
добавлено
Обновленный @muistooshort
добавлено автор Clodoaldo Neto, источник

Обычно превосходящий подход к insert values with a USING clause. Это избегает времени выполнения наверху кастинга, чтобы текст и назад и возможные опасности с цитированием специальных символов.

Можно также использовать ваш названных параметрами непосредственно. Никакой смысл в объявлении и назначении другого слоя локальных переменных:

CREATE OR REPLACE FUNCTION surrogate_del (_tblname text, _surro uuid)
   RETURNS void AS
$BODY$
BEGIN
   EXECUTE format('UPDATE %I SET ID = NULL WHERE surrogate = $1', _tblname)
   USING _surro;
END
$BODY$ LANGUAGE plpgsql

Я также преобразовал ваше имя функции к нижнему регистру и удалил двойные кавычки. Мой личный совет никогда - <им> , используют идентификаторы CamelCase в PostgreSQL. Это - постоянный источник боли.

На связанной ноте: не забудьте обеспечивать имя таблицы _tblname чувствительным к регистру способом. format() or quote_ident() сохраните правописание дословно.

3
добавлено
pgsql – PostgreSQL
pgsql – PostgreSQL
2 429 участник(ов)

Чат про PostgreSQL

DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)