Как установить значение поля составной переменной с использованием динамического 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')
работает, как и ожидалось, возвращая "Дэвид".
Но как я могу установить значение поля в составном типе? Я пробовал эти функции:
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. Любой совет в этом был бы оценен, но это не мой вопрос.