Anzeige:
Ergebnis 1 bis 13 von 13

Thema: Perl/Oracle: Insert von Select

  1. #1
    Registrierter Benutzer
    Registriert seit
    10.06.2003
    Beiträge
    19

    Perl/Oracle: Insert von Select

    Hi miteinander,

    Ich möchte alle Daten von einer Tabelle in die andere Kopieren:

    INSERT INTO tabletemp SELECT * FROM table WHERE IDENT='23';

    Dieser Query hat schon wunderbar funktioniert, wenn beide Tabellen gleich aufgebaut sind.

    Nun hat die tabletemp aber noch zwei 3 Spalten mehr: DBID, VALIDFROM und VALIDTO.

    Ich möchte nun in dem Query den Wert für die Spalte DBID mitgeben.

    Ich glaube, dass ich deshalb zuerst die Werte mit SELECT auslesen, dann weiterverarbeiten und erst dann mit INSERT schreiben kann.

    Ich habe aber leider keine Ahnung wie das geht. ;-) SQL bin ich erst noch am lernen.

    Kann mir jemand helfen?

    Vielen Dank!

  2. #2
    Registrierter Benutzer
    Registriert seit
    30.06.2005
    Beiträge
    155
    wo kriegst du denn den wert für dbid her? ist das ne konstante?
    religion is a virus from outer space

  3. #3
    Registrierter Benutzer
    Registriert seit
    10.06.2003
    Beiträge
    19
    Genau, dbid ist ein konstanter Wert.

  4. #4
    Registrierter Benutzer
    Registriert seit
    10.06.2003
    Beiträge
    19
    SELECT *
    FROM $table;

    DECLARE
    trec $table%NAME;
    BEGIN
    trec.DBID := '$dbid';
    trec.VALIDFROM := '';
    trec.VALIDTO := '';

    INSERT INTO $table
    VALUES trec;

    COMMIT;
    END;
    /

    Habe irgendwo etwas über PL/SQL gelesen. Könnte das hier funktionieren?

  5. #5
    Registrierter Benutzer
    Registriert seit
    30.06.2005
    Beiträge
    155
    wenn dbid wirklich ein konstanter wert ist kannst du's auch so machen
    Code:
    INSERT INTO tabletemp SELECT t.*, 'DBID123' FROM table t WHERE IDENT='23';
    wobei hier vorausgesetzt wird dass dbid die letzte spalte ist
    religion is a virus from outer space

  6. #6
    Registrierter Benutzer
    Registriert seit
    10.06.2003
    Beiträge
    19
    Das sieht schon ganz interessant aus und würde auch funktionieren, wenn DBID am Schluss wäre. Leider ist es aber die drittletzte Spalte...

    Gibt es eine Möglichkeit, direkt die Spalte DBID zu addressieren und in diese den Wert zu schreiben?

  7. #7
    WetnWild
    Gast
    INSERT INTO tabletemp SELECT Feld1, Feld2, 'DBID123', Feld3, Feld4, Feld5 FROM TABLE t WHERE IDENT='23';

    ...das müsste eigentlich funktionieren

  8. #8
    Registrierter Benutzer
    Registriert seit
    10.06.2003
    Beiträge
    19
    @WetnWild
    Danke für die Antwort.

    Leider sind es insgesamt 363 Rows und das würde ein ziemlich langer Query geben. ;-)

  9. #9
    Registrierter Benutzer
    Registriert seit
    30.06.2005
    Beiträge
    155
    werden die letzten beiden spalten auch mit daten aus der anderen tabelle befüllt, oder was kommt da rein?
    religion is a virus from outer space

  10. #10
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Zitat Zitat von bionic
    Leider sind es insgesamt 363 Rows und das würde ein ziemlich langer Query geben. ;-)
    Da musst du wohl durch

    Alternativer Tipp: Du packst die fehlende Spalte mit in die Ausgangstabelle oder einer Kopie davon, kopierst anschließend die Daten in die neue Tabelle und löscht die unnötige Spalte in der Tabelle wieder. Das befüllen der neuen Spalte mit Werten kannst du dann in einem anderen Schritt machen.

    Das würde sich aber eher dann anbieten, wenn du einmalig Daten kopieren willst. Falls das, was du vorhast, regelmäßig z.B. über ein Script laufen soll, dann würde ich eher die direkte Lösung, wie von WetnWild beschrieben, nehmen.

    Ich weiß nicht wie das bei Oracle genau ist, aber mglw. ist die Reihenfolge der Spalten auch egal, falls du noch Namen dahinterschreibst. Also SELECT `spaltenname` AS `neuer_spaltenname`. Das würde sich aber auch nur dann anbieten, wenn unbenannte Spalten auf den Rest verteilt werden würden - sonst müsstest du hunderte Spalten benennen...
    Geändert von BLUESCREEN3D (19-12-2005 um 19:03 Uhr)

  11. #11
    Registrierter Benutzer
    Registriert seit
    15.10.2005
    Ort
    Franken
    Beiträge
    362
    Oder du machst es so:

    INSERT INTO tabletemp (feld1, feld2, ....) VALUES ( SELECT fel1, feld2 .... FROM TABLE t WHERE IDENT='23');
    UPDATE tabletemp SET DBID = 'DBID123';
    Dank der Rekursion kann ich IF-Schleifen bauen.

    In neuem Glanz: www.turbohummel.de

  12. #12
    Registrierter Benutzer
    Registriert seit
    10.06.2003
    Beiträge
    19
    Schade...

    Das ist ja vielleicht aufwendig. ;-) Ich mache es so, dass ich einfach die DBID lösche und zuhinderst hinschiebe. Und dann mache ich es mit dem Tipp von ninguno.

    Hatte wirklich gehofft, dass mich SQL hier überraschen könnte, aber alles muss es ja auch nicht können.

    Wie sieht es denn mit PL/SQL aus? Wäre das damit möglich? Ich habe gedacht, dass man damit direkt in Oracle mit den Werten spielen könnte. Ist PL nicht sehr weit verbreitet? Setzt das überhaupt "ein normaler Programmierer" ein?

    Ich bedanke mich herzlich bei allen, die mir geholfen haben!

    Gruss
    bionic

  13. #13
    WetnWild
    Gast
    [Leider sind es insgesamt 363 Rows und das würde ein ziemlich langer Query geben. ;-)[/QUOTE]

    Na ja, verlangt ja keiner, dass Du Dir diese schön brav aufschreibst...

    Gib in SQL-Plus (oder wie das auch bei Oracle immer heissen mag...) folgenden Befehl ein:

    SELECT RTRIM(column_name), ', ' FROM dba_tab_columns WHERE table_name = 'Deine Tabelle' ORDER BY column_id

    Dann kriegst Du alle Felder der Reihe nach aufgelistet, mit Komma separated und kannst diese in den SQL als Abfrage mit "drag and drop" einfügen

    Habe leider keine Erfahrung mit PL/SQL - arbeite u.a. mit DB2 und Gupta

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •