Wie Wert von composite-variable-Feld mit dynamic SQL

Angesichts dieser Typ:

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

Bekomme ich den Wert eines Feldes dynamisch mit dieser Funktion:

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

Aufrufen get_field('(david)'::testType, 'name') funktioniert wie erwartet Rückkehr "david".

Aber wie kann ich einen Wert von einem Feld in ein composite-Typ? Ich habe versucht diese Funktionen:

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

und einige Variationen.
Aufruf set_field_tryX funktioniert nicht. Ich bekomme immer "FEHLER: syntax-Fehler an oder in der Nähe von...".
Wie kann ich dies erreichen?

Hinweise:

  • Der parameter anyelement und das Feld kann ein beliebiges Feld in der composite-Typ. Ich kann nicht einfach mit dem Objekt.name.
  • Ich bin besorgt über SQL-injection. Jede Beratung in diesem würde geschätzt werden, aber es ist nicht meine Frage.

InformationsquelleAutor DavidEG | 2011-10-10

Schreibe einen Kommentar