Comment définir la valeur de la variable composée champ à l'aide de SQL dynamique

Compte tenu de ce type:

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

Je peux obtenir la valeur d'un champ dynamiquement avec cette fonction:

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

Appel get_field('(david)'::testType, 'name') fonctionne comme prévu, le retour "david".

Mais comment puis-je définir une valeur d'un champ dans un type composite? J'ai essayé ces fonctions:

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

et quelques variations.
L'appel de set_field_tryX ne fonctionne pas. Je reçois toujours le message "ERREUR: erreur de syntaxe sur ou près de...".
Comment puis-je y arriver?

Notes:

  • Le paramètre est anyelement et le champ peut être un champ de type composite. Je ne peux pas utiliser l'objet.nom.
  • Je suis préoccupé par injection SQL. Tous les conseils dans ce serait appréciée, mais elle n'est pas ma question.

OriginalL'auteur DavidEG | 2011-10-10