Как установить значение поля составной переменной с использованием динамического SQL

Для данного типа:

-- Just for testing purposes:
CREATE TYPE testType as (name text)

Я могу получить значение поля динамически с помощью эта функция:

CREATE OR REPLACE FUNCTION get_field(object anyelement, field text) RETURNS text as
$BODY$
DECLARE
    value text;
BEGIN
    EXECUTE 'SELECT $1."' || field || '"'
      USING object
       INTO value;

    return value;
END;
$BODY$
LANGUAGE plpgsql

Вызов get_field ('(david)' :: testType, 'name') работает как ожидалось, возвращая «david».

Но как я могу установить значение поля в составном типе? Я пробовал эти функции:

CREATE OR REPLACE FUNCTION set_field_try1(object anyelement, field text, value text)
RETURNS anyelement
as
$BODY$
DECLARE
    value text;
BEGIN
    EXECUTE '$1."' || field || '" := $2'
      USING object, value;

    return object;
END;
$BODY$
LANGUAGE plpgsql

CREATE OR REPLACE FUNCTION set_field_try2(object anyelement, field text, value text)
RETURNS anyelement
as
$BODY$
DECLARE
    value text;
BEGIN
    EXECUTE 'SELECT $1 INTO $2."' || field || '"'
      USING value, object;

    return object;
END;
$BODY$
LANGUAGE plpgsql

CREATE OR REPLACE FUNCTION set_field_try3(object anyelement, field text, value text)
RETURNS anyelement
as
$BODY$
DECLARE
    value text;
BEGIN
    EXECUTE 'BEGIN $1."' || field || '" := $2; SELECT $1; END;'
       INTO object
      USING value, object;

    return object;
END;
$BODY$
LANGUAGE plpgsql

и некоторые варианты. Вызов set_field_tryX не работает. Я всегда получаю сообщение «ОШИБКА: синтаксическая ошибка около или около…». Как я могу это сделать?

Примечания:

  • Параметр - anyelement , а поле может быть любое поле в составном типе. Я не могу просто использовать object.name.
  • Меня беспокоит SQL-инъекция. Любые советы по этому поводу будут оценены, но это не мой вопрос.
12
задан Erwin Brandstetter 16 October 2011 в 07:09
поделиться