String(Text) zum Spaltennamen konvertieren

Hey !
Ich habe eine Tabelle die n Spalten enthält (Tabelle A). Die Namen dieser Spalten werden aus einer anderen Tabelle (Tabelle B) generiert.
Nun möchte ich in einer Funktion über einen Select-Befehl den Inhalt dieser Spalte abfragen.
Der Inhalt der Abfrage aus Tabelle B ergibt einen String(Text). Den ich noch erweitern muss, da es nur aus Zahlen besteht.
Möchte ich im nächsten Schritt den Inhalt von der Spalte aus Tabelle A abfragen.
Beispiel:
DECLARE
columnName TEXT;
valueAmount INTEGER;

columnName := ‘id_’ || (select productgrupping_id from TabelleB where … ); – =>Ergibt einen Text

valueAmount := (SELECT columnName from TabelleA where …);-- => Das geht nicht, da nicht der Inhalt sondern der Name von columnName zurückgegeben wird.

Ich möchte also zum Spatennamen deklarieren.
Wie kann ich das erreichen?

Du basteltst einen String, der die Abfrage enthält. Diesen verfütterst Du an exec().

Ergibt Syntaxfehler
DECLARE
columnName TEXT;
queryText TEXT;
valueAmount INTEGER;

columnName := ‘id_’ || (select productgrupping_id from TabelleB where … ); – =>Ergibt einen Text

queryText := 'SELECT ’ || columnName || ‘from TabelleA where …’)
valueAmount := EXECUTE queryText; – => Syntaxfehler bei »$1« LINE 1: SELECT (EXECUTE $1 )


^

manchmal helfen ein paar leerzeichen, wild verstreut, …

String korrigiert. Ist O.K.
Fehlermeldung bleibt die Selbe

columnName := ‘id_’ || (select productgrupping_id from TabelleB where … ); – =>Ergibt einen Text

queryText := ’ SELECT ’ || columnName || ’ from TabelleA where … ';
valueAmount := EXECUTE queryText; – => Syntaxfehler bei »$1« LINE 1: SELECT (EXECUTE $1 )

– Analog
queryText := ’ (SELECT ’ || ‘id_150009160’|| ’ from TabelleA where … )’;
valueAmount := EXECUTE queryText; – => Syntaxfehler bei »$1« LINE 1: SELECT (EXECUTE $1 )

Was mache ich verkehrt?

kein Debugging. Laß Dir doch mal den String ausgeben. raise notice ‘%’, <deine_string_variable>

Habe ich getan (Ausgabe):
HINWEIS: SELECT id_150009160 from TabelleA where ohed_id = 518546;


Sieht doch gut aus!?!


mache ich dann den Aufruf (Fehler beim compilieren):
EXECUTE queryText; – => Syntaxfehler bei »$1« LINE 1: SELECT (EXECUTE $1 )

Jetzt habe ich den String ohne Variable an das EXECUTE gehängt (Fehler erst bei der Ausführung):
valueAmount := EXECUTE SELECT id_150009160 from TabelleA where ohed_id = 518546; –
=> FEHLER: Typ »execute« existiert nicht LINE 1: SELECT EXECUTE ’ SELECT ’ || $1 || ’ from TabelleA …

http://www.postgresql.org/docs/9.3/static/plpgsql-statements.html, Kapitel 40.5.4. Executing Dynamic Commands

O.K Danke!
mit:
EXECUTE queryText INTO valueTotalAmount;

statt:
valueAmount := EXECUTE queryText ;

scheint es zu gehen!