PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl/Oracle: Insert von Select



bionic
19-12-2005, 12:08
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!

ninguno
19-12-2005, 12:54
wo kriegst du denn den wert für dbid her? ist das ne konstante?

bionic
19-12-2005, 13:13
Genau, dbid ist ein konstanter Wert.

bionic
19-12-2005, 13:35
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?

ninguno
19-12-2005, 13:58
wenn dbid wirklich ein konstanter wert ist kannst du's auch so machen
INSERT INTO tabletemp SELECT t.*, 'DBID123' FROM table t WHERE IDENT='23';wobei hier vorausgesetzt wird dass dbid die letzte spalte ist

bionic
19-12-2005, 14:57
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?

WetnWild
19-12-2005, 16:38
INSERT INTO tabletemp SELECT Feld1, Feld2, 'DBID123', Feld3, Feld4, Feld5 FROM TABLE t WHERE IDENT='23';

...das müsste eigentlich funktionieren

bionic
19-12-2005, 16:55
@WetnWild
Danke für die Antwort.

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

ninguno
19-12-2005, 17:22
werden die letzten beiden spalten auch mit daten aus der anderen tabelle befüllt, oder was kommt da rein?

BLUESCREEN3D
19-12-2005, 19:00
Leider sind es insgesamt 363 Rows und das würde ein ziemlich langer Query geben. ;-)
Da musst du wohl durch :D

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...

Turbohummel
19-12-2005, 19:06
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';

bionic
19-12-2005, 19:43
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

WetnWild
21-12-2005, 19:56
[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 :cool:

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