Tabellenname zuweisen

Fragen und Probleme zu PL/pgSQL.

Tabellenname zuweisen

Beitragvon beho » Di 7. Nov 2006, 10:42

Hallo,

steh voll aufm Schlauch, folgendes Function:
Code: Alles auswählen
Create OR Replace Function CreateTimeLine() RETURNS TRIGGER AS $CreateTimeLine$
DECLARE
tabname text;
Begin
   IF NEW.name IS NULL THEN
      RAISE EXCEPTION 'name cannot be null';
   ELSIF NEW.TimeLine_table IS NOT NULL THEN
      tabname := NEW.name;
        END IF;
   
   CREATE TABLE TimeLinetables.tabname (
      id bigserial NOT NULL,
      ts time NOT NULL,
      val float8 NOT NULL DEFAULT 0
   );

   RETURN NEW;
End;
$CreateTimeLine$ LANGUAGE plpgsql;

CREATE TRIGGER CreateTimeLine BEFORE INSERT OR UPDATE ON TimeLine
    FOR EACH ROW EXECUTE PROCEDURE CreateTimeLine();


Knackpunkt ist Zeile 11. Eigentlich soll der zu erstellenden Tabelle der Wert von tabname zugewiesen werden. So wie es dasteht, wird die Tabelle aber direkt "tabname" genannt... Ich schätz ma s is n reines Syntaxproblem und erbitte Hilfe.

Danke im Voraus
beho
beho
Benutzer
 
Beiträge: 64
Registriert: Di 24. Okt 2006, 11:49
Wohnort: Erfurt

Beitragvon akretschmer » Di 7. Nov 2006, 10:49

beho hat geschrieben:Hallo,

steh voll aufm Schlauch, folgendes Function:
Code: Alles auswählen
Create OR Replace Function CreateTimeLine() RETURNS TRIGGER AS $CreateTimeLine$
DECLARE
tabname text;
Begin
   IF NEW.name IS NULL THEN
      RAISE EXCEPTION 'name cannot be null';
   ELSIF NEW.TimeLine_table IS NOT NULL THEN
      tabname := NEW.name;
        END IF;
   
   CREATE TABLE TimeLinetables.tabname (
      id bigserial NOT NULL,
      ts time NOT NULL,
      val float8 NOT NULL DEFAULT 0
   );

   RETURN NEW;
End;
$CreateTimeLine$ LANGUAGE plpgsql;

CREATE TRIGGER CreateTimeLine BEFORE INSERT OR UPDATE ON TimeLine
    FOR EACH ROW EXECUTE PROCEDURE CreateTimeLine();


Knackpunkt ist Zeile 11. Eigentlich soll der zu erstellenden Tabelle der Wert von tabname zugewiesen werden. So wie es dasteht, wird die Tabelle aber direkt "tabname" genannt... Ich schätz ma s is n reines Syntaxproblem und erbitte Hilfe.

Danke im Voraus
beho


Du suchst EXECUTE, dem Du einen String gibst, welcher Dein CREATE-Stament enthält. Beispiele siehe Doku.
akretschmer
Erfahrener Benutzer
 
Beiträge: 5936
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

hmhm

Beitragvon beho » Di 7. Nov 2006, 11:03

Hallo,

argh, jetz wo du s sagst...

Dank dir!!!
beho
Benutzer
 
Beiträge: 64
Registriert: Di 24. Okt 2006, 11:49
Wohnort: Erfurt

Beitragvon ads » Di 7. Nov 2006, 12:36

In deinem Fall wird die Funktion fertig geparst und der Text "tabname" als Name der Tabelle angenommen. Mit einem EXECUTE kannst du dynamisch Strings zusammensetzen und diese auch ausführen lassen.

Jetzt solltest du noch die Tabelle TimeLinetables.tabname löschen, die ist nämlich nun zuviel ;-)
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

PostgreSQL Service & Support
ads
Erfahrener Benutzer
 
Beiträge: 4147
Registriert: Mi 8. Feb 2006, 11:58
Wohnort: MD

Beitragvon beho » Di 7. Nov 2006, 15:36

Hallo,

freilich freilich nachdem ich mir die Doku zu EXECUTE durchgelesen hab is auch alles ganz klar...
Bin halt noch die @parameter vom MS-SQL Server gewohnt ;o)

danke nochmal
Grüße
beho
beho
Benutzer
 
Beiträge: 64
Registriert: Di 24. Okt 2006, 11:49
Wohnort: Erfurt


Zurück zu PL/pgSQL

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste

cron