Announcement

Collapse
No announcement yet.

Create Table in Funktion aufrufen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Create Table in Funktion aufrufen

    Hallo,
    ich bin neu bei PL SQL, vielleicht kann mir ja jemadn helfen.
    Ich möchte gerne in einer Funktion eine Tabelle erstellen.
    Dazu habe ich eine Funktion geschreiben, die zuvor prüft ob die Tabelle vorhanden ist, wenn nicht soll sie erstellt werden.
    Aber wie rufe ich denn ein Create Tabel in einer Funktion auf?

    So scheint es nicht richtig zu sein:


    CREATE TABLE table_name
    (
    column1 datatype [ NULL | NOT NULL ],
    column2 datatype [ NULL | NOT NULL ],
    ...
    column_n datatype [ NULL | NOT NULL ]
    );


    und so auch nicht:

    EXECUTE IMMEDIATE CREATE TABLE table_name
    (
    column1 datatype [ NULL | NOT NULL ],
    column2 datatype [ NULL | NOT NULL ],
    ...
    column_n datatype [ NULL | NOT NULL ]
    );

    hat da jemand einen Tip?

  • #2
    EXECUTE IMMEDIATE 'create table...'
    mit Hochkomma

    besser
    stmt := 'create...'
    execute immediate stmt;
    Christian

    Comment


    • #3
      Hallo,

      ja, hatte ich auch schon so benutzt, Sollte so auch funktionieren, das ist nur rot unterlegt, weil ich die
      Dummys da noch drin habe:

      TABLE table_name
      (
      column1 datatype [ NULL | NOT NULL ],
      column2 datatype [ NULL | NOT NULL ],


      Vielen danke für die rasche Unterstützung :-)

      Comment


      • #4
        Dann musst du die konkrete Zeile hier zeigen. Das Beispiel von techonthenet nützt nichts.
        Wie bei Stringverarbeitung sind ggf. Variablen (Dummys??) zu verbinden (Leerzeichen beachten)

        stmt := 'create table '||VARAIBLE_DES_NAMES||' (column1... '
        Zuletzt editiert von Christian Marquardt; 11.07.2019, 10:01.
        Christian

        Comment


        • #5
          Originally posted by Mokkie View Post
          Hallo,
          ja, hatte ich auch schon so benutzt,
          ..snipp...

          Vielen danke für die rasche Unterstützung :-)

          Da Du schon mehrere Beiträge hier gebracht hast, besteht ja die Hoffnung, dass Du das hier auch noch vor die Nase bekommst.. oder wenigstens jemand anderes

          Wenn Du execute immediate verwendest und damit eine Tabelle erzeugst, ..
          nein anders:

          IMMER wenn Du in Oracle eine Tabelle erzeugst, DDL ganz allgemein, stellt Oracle implizit ein COMMIT voran!

          Muss Dich das interessieren?
          Ja!

          Du kannst in solch einer Situation niemals ein vollständiges Rollback machen, weder implizit im Fehlerfall, noch explizit, wenn Du aktiv die durchgeführten Operation verwirfst.

          Was bedeutet das?
          Wird dieser Befehl direkt oder verdeckt über eine SP in irgendeiner DML Sequenz abgesetzt / eingeschoben, ist alles davor unwideruflich commited.
          Der "Selbstschutzmechanismus" einer transaktionsbasierten Operation funktioniert dann nicht mehr. Im Fehlerfall kann die DB das Rollback nur unvollständig durchgeführen und ist damit ggF. in einem inkonsistenten Zustand.


          Man macht also nicht ohne Not irgendwo dynamisch ein "Create Table.."
          Wenn man glaubt, dass es nicht anders geht, muss man sich einfach bewusst sein, was es für Seiteneffekte hat bzw. haben kann.
          Man würde deshalb davor sicherstellen, dass alles paletti ist, also keine Transaktion offen ist.
          Darüber hinaus würde man eine solche Oracle Operation (Stored Procedure) entsprechend dokumentieren und jedem, der sie nutzt deutlich machen, dass diese Operation ein Commit auf alles Offene durchführt.
          Das tut sie sogar- besonders lustig- wenn sie selbst fehlschlägt, weil sie ja vor dem wichtigen DDL Statement selbst erstmal "reinen Tisch" macht. Wer kann schon ahnen, dass das DDL Statement nicht funktionieren wird.
          Man würde die Operation evtl. auch mit Berechtigungen versehen, die den sorglosen Einsatz verhindern.

          Die mögliche Tragweite dieses Sachverhaltes ist Dir vielleicht nicht bewusst, weil du (Oracle) Neuling bist und weder die Problematik der Transaktionen an sich kennst, noch das besondere Verhalten von Oracle. Vielleicht ist auch die Art des Einsatzes systematisch so angelegt, dass das Problem nicht auftaucht. Umso gemeiner, wenn es unbemerkt doch geschieht.

          Comment

          Working...
          X