COPY (KOPIEREN)

Einschränkung: Verwenden Sie den COPY-Befehl nicht. Verwenden Sie für Lade- oder Entladeoperationen den nzload-Befehl oder CREATE EXTERNAL TABLE-Befehle. Diese Befehle sind schneller und stabiler als der COPY-Befehl. Der COPY-Befehl wird hier dokumentiert, weil er für interne Operationen verwendet wird.

Mit dem COPY-Befehl werden Daten zwischen Tabellen und Standard-Dateisystemdateien verschoben. Mit dem COPY-Befehl und einem Dateinamen können Sie direkt aus einer Datei lesen oder in eine Datei schreiben.
  • Mit dem COPY TO-Befehl können Sie den gesamten Inhalt einer Tabelle in eine Datei kopieren. Der COPY TO-Befehl bearbeitet keine Spaltenstandardwerte.
  • Mit dem COPY FROM-Befehl können Sie Daten aus einer Datei in eine Tabelle kopieren. Wenn die Tabelle bereits Daten enthält, fügt der Befehl Daten an sie an.

SQL92 unterstützt den COPY-Befehl nicht. Sie können den COPY-Befehl mit einfachen Tabellen, aber nicht mit Ansichten verwenden.

Wenn Sie einen COPY-Befehl verwenden, liest oder schreibt das System eine Textdatei mit einer Zeile pro Tabellenzeile. Das Begrenzungszeichen trennt Spalten (Attribute) in einer Zeile. Die Attributwerte sind Zeichenfolgen, die die Ausgabefunktion für den Datentyp der einzelnen Attribute generiert oder die von der Eingabefunktion verarbeitet werden können. Das System verwendet die angegebene Nullwertzeichenfolge anstelle von Nullattributen.

Bei einer Textkopie wird standardmäßig ein Tabulatorzeichen ("\t") als Begrenzungszeichen zwischen Feldern verwendet. Sie können das Feldbegrenzungszeichen mit der Schlüsselwortphrase über Begrenzungszeichen in ein beliebiges anderes einzelnes Zeichen ändern. Das System verwendet aus Backslashes bestehende Anführungszeichen für Datenfelder, die mit dem Begrenzungszeichen übereinstimmen. Sie können das Ende der Daten durch eine einzelne Zeile mit einem Backslash-Period (\.) darstellen. Eine Datenende-Markierung ist nicht erforderlich, wenn Sie aus einer UNIX-Datei lesen, aber Sie müssen eine Ende-Markierung angeben, wenn Sie Daten in oder aus einer Client-Anwendung kopieren.

Der COPY-Befehl wird beim ersten Fehler gestoppt. Beim COPY FROM-Befehl ist dies kein Problem. Beim COPY TO-Befehl erhält die Zielbeziehung bereits frühere Zeilen. Diese Zeilen können nicht angezeigt werden und es kann auch nicht auf andere Weise auf sie zugegriffen werden, aber sie belegen Festplattenspeicher. Dies kann zu einer großen Menge von unnötig belegtem Festplattenspeicher führen, wenn der Fehler mitten in einer umfangreichen Kopieroperation auftritt.

Sie können Datenzeichen, die andernfalls als Zeilen- oder Spaltenbegrenzungszeichen angesehen werden könnten, mit Backslash-Zeichen (\) in den COPY-Befehlsdaten einschließen. Insbesondere muss vor folgenden Zeichen ein Backslash angegeben werden, wenn sie als Teil eines Attributwerts angezeigt werden: das Backslash-Zeichen selbst, das Zeilenumbruchzeichen und das aktuelle Begrenzungszeichen.

Wenn Sie einen Dateinamen verwenden, geben Sie immer einen absoluten Pfad an. Der Datenbankserver erzwingt im Falle des COPY TO-Befehls einen absoluten Pfad, aber für den COPY FROM-Befehl haben Sie die Option, Daten aus einer Datei zu lesen, die durch einen relativen Pfad angegeben wird. Das System interpretiert den Pfad relativ zum Arbeitsverzeichnis des Datenbankservers, nicht zum Netezza Performance Server SQL-Arbeitsverzeichnis.

In der folgenden Tabelle werden die Backslash-Sequenzen des COPY FROM-Befehls beschrieben.
Tabelle 1. COPY FROM-Backslash-Sequenzen
Reihenfolge Repräsentiert
\b Rückschritt (ASCII 8)
\f Formularvorschub (ASCII 12)
\n Zeilenvorschub (ASCII 10)
\r Wagenrücklauf (ASCII 13)
\t Tabulator (ASCII 9)
\v Vertikaltabulator (ASCII 11)
\Ziffern Ein Backslash, gefolgt von ein bis drei Oktalziffern, gibt das Zeichen mit dem betreffenden numerischen Code an.

Der COPY TO-Befehl gibt keine Backslash-Sequenz mit Oktalziffern aus, aber er verwendet die anderen Sequenzen, die in der vorherigen Tabelle aufgelistet sind, für diese Steuerzeichen.

Einschränkung: Fügen Sie keinen Backslash vor einem Datenzeichen N oder einem Punkt (.) ein. Solche Paare werden fälschlicherweise für die Standard-Nullzeichenfolge oder die Datenende-Markierung gehalten. Jedes andere Backslash-Zeichen, das in der vorherigen Tabelle nicht erwähnt ist, steht für sich selbst.

Anwendungen, die COPY-Befehlsdaten generieren, konvertieren Zeilenvorschubmarkierungen für Daten in \n-Sequenzen und Wagenrücklaufzeichen in \r-Sequenzen.

Das Ende jeder Zeile wird durch eine Newline ("\n") im UNIX-Stil gekennzeichnet. Der COPY FROM-Befehl funktioniert mit einer Datei, die Zeilenvorschubmarkierungen im DOS- oder Mac-Stil enthält, nicht ordnungsgemäß.

Syntax

Syntax für Eingabe, die von einer Clientanwendung kommt:
COPY [BINARY] table 
    FROM { 'file name' | stdin }
    [ [USING] DELIMITERS 'delimiter' ]
    [ WITH NULL AS 'null string' ];
Syntax für Ausgabe, die in eine Clientanwendung übertragen wird:
COPY table 
    TO { 'file name' | stdout }
    [ [USING] DELIMITERS 'delimiter' ]
    [ WITH NULL AS 'null string' ];

Eingaben

Für den COPY-Befehl sind die folgenden Eingaben zulässig:

Tabelle 2. Eingabe für COPY
Eingabe Beschreibung
BINÄR Ändert das Verhalten der Feldformatierung. Erzwingt das Speichern oder Lesen aller Daten im Binärformat statt im Textformat.
Begrenzungszeichen Das Zeichen, das Felder in jeder Zeile der Datei trennt.
Dateiname Der absoluter Pfadname der Ein- oder Ausgabedatei.
Nullzeichenfolge Die Zeichenfolge, die einen Nullwert darstellt. Der Standardwert ist "\N" (Backslash-N).

Beim Hineinkopieren werden alle Datenelemente, die mit dieser Zeichenfolge übereinstimmen, als Nullwert gespeichert. Stellen Sie sicher, dass Sie dieselbe Zeichenfolge wie beim Hinauskopieren verwenden.

stdin Die Eingabe soll aus der Clientanwendung kommen.
Standardausgabe Die Ausgabe soll in die Clientanwendung geleitet werden.
Tabelle Der Name einer vorhandenen Tabelle.

Ausgaben

Der COPY-Befehl hat die folgende Ausgabe:
Tabelle 3. Ausgabe von COPY
Ausgabe Beschreibung
COPY Das System gibt diese Nachricht zurück, wenn die Kopie erfolgreich abgeschlossen ist.
ERROR: reason Wenn ein Kopiervorgang fehlschlägt, gibt das System diese Nachricht mit einem Grund für den Fehler zurück.

Zugriffsrechte

Sie müssen über die Berechtigung zum Auswählen für jede Tabelle verfügen, deren Werte vom COPY-Befehl gelesen werden. Sie müssen über die Berechtigung zum Einfügen oder Aktualisieren für eine Tabelle verfügen, in die Werte vom COPY-Befehl eingefügt werden. Der Datenbankserver muss die entsprechenden Berechtigungen für jede Datei haben, die vom COPY-Befehl gelesen oder geschrieben wird.

Verwendung

Im Folgenden ist ein Verwendungsbeispiel angegeben.
  • Tabelle durch Angabe eines vertikalen Strichs (|) als Feldbegrenzer in die Standardausgabe kopieren:
    MYDB.SCH1(USER)=> COPY country TO stdout USING DELIMITERS '|';
  • Kopieren Sie Daten aus einer UNIX-Datei in die Tabelle Land:
    MYDB.SCH1(USER)=> COPY country FROM
    '/usr1/proj/bray/sql/country_data';
  • Dies ist ein Beispiel für Daten, die sich zum Kopieren in eine Tabelle aus der Standardeingabe eignen (daher enthält es die Beendigungszeichenfolge in der letzten Zeile):
    AF      AFGHANISTAN
    AL      ALBANIA
    DZ      ALGERIA
    ZM      ZAMBIA
    ZW      ZIMBABWE
    \.