Auf Spaltenname abfragen

Hallo zusammen,

habe folgendes Problem:

In einer Tabelle die verschiedene Jahre als Spalten hat (JAHR2001, JAHR2002, JAHR2003 …) will ich immer nur die Spalte eines bestimmten Jahres aktualisieren. Das Jahr habe ich auf einer Variabeln j vom typ date gespeichert, beispielsweise ist j = 2005.
Nun will ich die entsprechende Spalte ändern mit:

UPDATE tabelle
SET JAHR**** = wert

Für die 4 Sternchen soll natürlich das auf der Variabeln j gespeicherte Jahr verwendet werden. Gibt es eine Möglichkeit so etwas zu realisieren. Ich arbeite mit einer Oracle 10g Datenbank.

Schon einmal vielen Dank im voraus.

Schöne Grüße

Hallo David,

du brauchst dynamisches SQL, oder, um noch einen Suchbegriff für Google zu liefern, „execute immediate“.

HTH, muzel

Hallo David,
da musst du dann schon PL/SQL mit dynamisch generierten SQL-Statements bemühen. Also etwa so (ungetestet, habe gerade kein Oracle im Zugriff):

-- ausfuehren z.B. mit SQLPLUS

declare
 -- Bsp.wert in Variable j
 j DATE := to\_date('01.01.2006', 'DD.MM.YYYY'); 

 wert tabelle.jahr2004%TYPE; -- die Spalten werden wohl alle
 -- denselben Typ haben, oder???
 sql\_str VARCHAR2(200); -- dyn. SQL-String
begin
 wert := 'wasimmerduwillst'; -- VARCHAR2 angenommen
 sql\_str := '
UPDATE
 tabelle
SET 
 JAHR' || to\_char(j, 'YYYY') || '= :wert';

 execute immediate
 sql\_str
 using
 wert;

 commit;
end;
/

Das DB-Design mit diesen verschiedenen Spaltennamen ist jedoch extrem bescheiden (du solltest dir vielleicht nochmal überlegen, ob nicht eine Kombination aus zwei Columns JAHR / WERT sinnvoller wäre…).

gruss
bernhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

– ausfuehren z.B. mit SQLPLUS

declare
– Bsp.wert in Variable j
j DATE := to_date(‚01.01.2006‘, ‚DD.MM.YYYY‘);

wert tabelle.jahr2004%TYPE; – die Spalten werden wohl
alle
– denselben Typ haben,
oder???
sql_str VARCHAR2(200); – dyn. SQL-String
begin
wert := ‚wasimmerduwillst‘; – VARCHAR2 angenommen
sql_str := ’
UPDATE
tabelle
SET
JAHR’ || to_char(j, ‚YYYY‘) || ‚= :wert‘;

execute immediate
sql_str
using
wert;

commit;
end;
/

Ja super, habe es jetzt genau so gemacht und klappt prima. Vielen Dank für die schnelle und gute Antwort.

Schöne Grüße

„execute immediate“ war das Stichwort das ich brauchte. Vielen Dank für die Antwort!

Schöne Grüße

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]