View Full Version : create or replace table
Guten Abend.
Wir wollen unsere
Create Table lib/file as (
select .... from ... where ...) with data
Befehle ersetzen und statt Create ein create or replace verwenden (V7R1)
Da geht nun das "with data" nicht!
Was muß ich stat dessen machen
Danke
Dietlinde Beck
... hört sich nach einem Anwendungsfall für eine "materialized Query table" an, die wird einmal erstellt und kann dann mit REFRESH TABLE aktualisiert werden.
D*B
Hallo Herr Bender,
Das würde hier warscheinlich zu viel durcheinander bringen.
Ich werde es mal mit den Kollegen durchsprechen.
Geht denn ein "create or replace" nicht, wenn ich gleichzeitig Daten kopieren möchte?
Danke
DiBe
Mach das dann in 3 Schritten:
Create or replace Table MyTable ...;
delete from MyTable;
Insert into MyTable select * from MyTable2;
Ggf. mach den Delete vor dem Create or replace.
Der Create or Replace führt einen Alter Table unter Beibehaltung der Daten sowie aller Indizes durch.
Wenn sich deine Spalten geändert haben, verwende eben mehrere Schritte.
Verwirrend,
... aber Du must WITH NO DATA angeben, damit die vorhandenen Daten nicht überklatscht werden.
Nur zur Info:
CREATE OR REPLACE in Verbindung mit einem SELECT-Statement kann man auch nutzen, wenn man auf eine Feld-Referenz-Datei referenziert.
Ändert sich die Feld-Referenz-Datei muss man lediglich den CREATE OR REPLACE Table erneut ausführen und erhält so die geänderte Tabelle (mit allen abhängigen Objekten, wie Indices, Views, logische Dateien, Trigger, Constraints etc) ohne dass eine weitere Aktion notwendig ist.
Bei Datei-Erweiterungen oder Änderungen wird lediglich das SELECT-Statement angepasst.
CREATE OR REPLACE unterstützt allerdings nur, das, was der ALTER TABLE unterstützt.
Falls irgendjemand auf die POW3R kommt: Genau das ist das Thema meines Vortrags
Birgitta
andreaspr@aon.at
11-11-16, 08:17
Beim CREATE OR REPLACE kannst du auch ON REPLACE DELETE ROWS angeben.
Damit werden die Daten auch gleich gelöscht, falls die Tabelle schon existiert.
Hallo, guten Morgen zusammen,
es ist ein Ablauf, der in unregelmäßigen Abständen Daten 'copiert' und einer anderen Verarbeitung, teilweise PC, teilweise iSeries, zur Verfügung stellt.
Der alte Ablauf war
drop table
create Table ... with data
Jeweils in einem qmqry Statement, aufgerufen von einem CL, um das drop abzufangen, falls die Datei nicht existiert.
Das wollte ich vereinfachen nach dem Motto:
Wenn sie existiert: überschreibe sie, wenn Sie fehlt: erstelle sie
Wenn create or replace das nicht kann, lass ich es wie es ist. Es sollte ja nur aus den 2 qmqry eins gemacht werden.
Dietlinde Beck
andreaspr@aon.at
11-11-16, 08:36
Wenn sich das Query nicht ändert, würde ich auch wie von Dieter vorgeschlagen MQTs einsetzen.
Das ist nichts anderes als ein CREATE TABLE den du aber nur 1 mal absetzten musst.
Sollen die Daten Aktualisiert werden, einfach ein REFRESH TABLE TAB1 und fertig.
Damit ersparst du dir dann immer wieder die Tabelle neu zu erstellen.
Statt des Create Table kann sich auch durchaus ein Create View lohnen.
Schließlich spart man sich die ganze regelmäßige Kopierarie und das Ergebnis ist immer aktuell.
Eine Kopie der Daten ist doch tatsächlich nur für Spezialfälle wie CPYTOIMPF erforderlich, da der immer noch nicht aus einer View lesen kann. In diesem Fall läuft dann halt der Create explizit z.B. in die QTEMP.
Alle anderen können doch native auf die View zugreifen.
andreaspr@aon.at
11-11-16, 09:09
Eine Kopie der Daten ist doch tatsächlich nur für Spezialfälle wie CPYTOIMPF erforderlich
Wir verwenden im CPYTOIMPF bereits Views.
Der Grund warum eine Tabelle erstellt wird, könnte auch sein, dass die Daten einige Zeit benötigen. Das kann ich dann vorgelagert laufen lassen und kann dann schnell mit dem Ergebnis arbeiten.