Daten aus Dateien in der Cloud laden
Das PL/SQL-Package DBMS_CLOUD
unterstützt das Laden von Daten aus Dateien in der Cloud in Tabellen, die in Autonomous Database on Dedicated Exadata Infrastructure erstellt wurden.
DBMS_CLOUD
bereitgestellt werden:
- Textdateien in der Cloud mit der Prozedur
DBMS_CLOUD.COPY_DATA
- JSON-Dateien in der Cloud mit der Prozedur
DBMS_CLOUD.COPY_TEXT
- Die Quelldatei ist als lokale Datei auf Ihrem Clientrechner oder in einem cloudbasierten Objektspeicher wie Oracle Cloud Infrastructure Object Storage verfügbar, und der Datenbankbenutzer kann Daten laden.
- Die Zugangsdaten für den Cloud-Objektspeicher wurden mit der Prozedur
DBMS_CLOUD.CREATE_CREDENTIAL
gespeichert. Weitere Informationen finden Sie unter Zugangsdaten erstellen.
Das Package DBMS_CLOUD
unterstützt das Laden von Dateien in den folgenden Cloud-Services: Oracle Cloud Infrastructure Object Storage, Oracle Cloud Infrastructure Object Storage Classic, Azure Blob Storage und Amazon S3.
Verwandte Themen
Zugangsdaten erstellen
Hier erfahren Sie, wie Sie die Zugangsdaten für den Cloud-Objektspeicher mit der Prozedur DBMS_CLOUD.CREATE_CREDENTIAL
speichern.
DBMS_CLOUD.CREATE_CREDENTIAL
mit einem beliebigen Datenbanktool wie SQL*Plus, SQL Developer oder Database Actions (webbasiertes SQL Developer-Tool) aus. Beispiel:BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL
(
credential_name => 'DEF_CRED_NAME',
username => 'adb_user@oracle.com',
password => 'password'
);
END;
/
Die Werte, die Sie für username
und password
angeben, hängen vom verwendeten Cloud-Objektspeicherservice ab:
-
Oracle Cloud Infrastructure Object Storage:
username
ist Ihr Oracle Cloud Infrastructure-Benutzername, undpassword
ist Ihr Oracle Cloud Infrastructure-Auth-Token. Siehe Mit Authentifizierungstoken arbeiten. -
Oracle Cloud Infrastructure Object Storage Classic:
username
ist Ihr Oracle Cloud Infrastructure Classic-Name.password
ist Ihr Oracle Cloud Infrastructure Classic-Kennwort.
Dieser Vorgang speichert die Zugangsdaten in einem verschlüsselten Format in der Datenbank. Sie können einen beliebigen Namen als Zugangsdatenname verwenden. Beachten Sie, dass dieser Schritt nur einmal erforderlich ist, es sei denn, Ihre Objektspeicherzugangsdaten werden geändert. Nachdem Sie die Zugangsdaten gespeichert haben, können Sie denselben Zugangsdatennamen für alle Dataloads verwenden.
Daten aus Textdateien laden
Erfahren Sie, wie Sie Daten mit der Prozedur DBMS_CLOUD.COPY_DATA
aus Textdateien in die Cloud in Autonomous Database laden.
Die Quelldatei in diesem Beispiel channels.txt
enthält die folgenden Daten:
S,Direct Sales,Direct T,Tele Sales,Direct C,Catalog,Indirect I,Internet,Indirect P,Partners,Others
JSON-Datei mit Dokumenten mit Begrenzungszeichen in eine Collection laden
Erfahren Sie, wie Sie eine JSON-Datei mit getrennten Dokumenten mit der Prozedur DBMS_CLOUD.COPY_DATA
in eine Collection in Autonomous Database laden.
In diesem Beispiel werden JSON-Werte aus einer zeilenbegrenzten Datei geladen und die JSON-Datei myCollection.json
verwendet. Jeder Wert ( jede Zeile) wird als einzelnes Dokument in eine Collection in Autonomous Database geladen.
Nachfolgend finden Sie ein Beispiel für eine solche Datei. Es enthält drei Zeilen mit einem Objekt pro Zeile. Jedes dieser Objekte wird als separates JSON-Dokument geladen.
{ "name" : "apple", "count": 20 } { "name" : "orange", "count": 42 } { "name" : "pear", "count": 10 }
Array von JSON-Dokumenten in eine Collection laden
Erfahren Sie, wie Sie ein Array von JSON-Dokumenten mit der Prozedur DBMS_CLOUD.COPY_COLLECTION
in eine Collection in Autonomous Database laden.
In diesem Beispiel wird die JSON-Datei fruit_array.json
verwendet. Im Folgenden wird der Inhalt der Datei fruit_array.json
angezeigt:
[{"name" : "apple", "count": 20 }, {"name" : "orange", "count": 42 }, {"name" : "pear", "count": 10 }]
JSON-Daten in eine vorhandene Tabelle kopieren
Verwenden Sie DBMS_CLOUD.COPY_DATA
, um JSON-Daten in der Cloud in eine Tabelle zu laden.
Die Quelldatei in diesem Beispiel ist eine JSON-Datendatei.
Dataloads überwachen und Fehler beheben
Alle mit dem PL/SQL-Package
ausgeführten Dataload-Vorgänge werden in den Tabellen DBMS_CLOUD
dba_load_operations
und user_load_operations
protokolliert:
-
dba_load_operations
: Zeigt alle Ladevorgänge an. -
user_load_operations
: Zeigt die Ladevorgänge in Ihrem Schema an.
Fragen Sie diese Tabellen ab, um Informationen zu laufenden und abgeschlossenen Dataloads anzuzeigen. Beispiel: Wenn Sie eine SELECT
-Anweisung mit einem WHERE
-Klauselprädikat für die Spalte TYPE
verwenden, werden Ladevorgänge mit dem Typ COPY
angezeigt:
SELECT table_name, owner_name, type, status, start_time, update_time, logfile_table, badfile_table
FROM user_load_operations WHERE type = 'COPY';
TABLE_NAME OWNER_NAME TYPE STATUS START_TIME UPDATE_TIME LOGFILE_TABLE BADFILE_TABLE
---------- ----------- ------- ---------- ---------------------- --------------------- --------------- ------------- ------------- -------------
CHANNELS SH COPY COMPLETED 04-MAR-21 07.38.30.522711000 AM GMT 04-MAR-21 07.38.30.522711000 AM GMT COPY$1_LOG COPY$1_BAD
In der Spalte LOGFILE_TABLE
wird der Name der Tabelle angezeigt, die Sie abfragen können, um das Log eines Ladevorgangs anzuzeigen. Beispiel: Die folgende Abfrage zeigt das Log des Ladevorgangs an:
select * from COPY$21_LOG;
In der Spalte BADFILE_TABLE
wird der Name der Tabelle angezeigt, die Sie abfragen können, um die Zeilen anzuzeigen, die beim Laden fehlerhaft waren. Beispiel: Die folgende Abfrage zeigt die abgelehnten Datensätze für den Ladevorgang an:
select * from COPY$21_BAD;
Je nach den im Log angezeigten Fehlern und den in der angegebenen BADFILE_TABLE
-Tabelle angezeigten Zeilen können Sie den Fehler korrigieren, indem Sie die richtigen Formatoptionen in DBMS_CLOUD.COPY_DATA
angeben.
Hinweis:
Die TabellenLOGFILE_TABLE
und BADFILE_TABLE
werden für jeden Ladevorgang zwei Tage lang gespeichert und dann automatisch entfernt.
Informationen zum Löschen der Tabelle user_load_operations
finden Sie unter DELETE_ALL_OPERATIONS-Prozedur.
JSON-Textobjekte, die erweiterte skalare Werte darstellen
Native binäre JSON-Daten (OSON-Format) erweitern die JSON-Sprache durch Hinzufügen skalarer Typen, wie Datumsangaben, die SQL-Typen entsprechen und nicht zum JSON-Standard gehören. Oracle Database unterstützt auch die Verwendung von JSON-Textobjekten, die skalare JSON-Werte darstellen, einschließlich solcher benutzerdefinierten Werte.
Wenn Sie native binäre JSON-Daten aus JSON-Textdaten erstellen, die solche erweiterten Objekte enthalten, können sie optional durch entsprechende skalare JSON-Werte (native Binärdaten) ersetzt werden.
Ein Beispiel für ein erweitertes Objekt ist {"$numberDecimal":31}
. Es stellt einen skalaren JSON-Wert des Nicht-Standardtyps Dezimalzahl dar und wird bei der Interpretation als solcher durch eine Dezimalzahl im nativen Binärformat ersetzt.
Beispiel: Wenn Sie den JSON-Datentypkonstruktor JSON
und das Schlüsselwort EXTENDED
verwenden, werden erkannte erweiterte Objekte in der Texteingabe durch entsprechende skalare Werte im nativen binären JSON-Ergebnis ersetzt. Wenn Sie das Schlüsselwort EXTENDED
nicht aufnehmen, findet keine derartige Ersetzung statt. Die erweiterten JSON-Textobjekte werden einfach unverändert in JSON-Objekte im nativen Binärformat konvertiert.
Wenn Sie umgekehrt mit der Oracle SQL-Funktion json_serialize
binäre JSON-Daten als JSON-Textdaten serialisieren (VARCHAR2
, CLOB
oder BLOB
), können Sie das Schlüsselwort EXTENDED
verwenden, um (native binäre) skalare JSON-Werte durch entsprechende erweiterte JSON-Textobjekte zu ersetzen.
Hinweis:
Wenn die verwendete Datenbank eine Oracle Autonomous Database-Instanz ist, können Sie mit der PL/SQL-Prozedur DBMS_CLOUD.copy_collection
eine JSON-Dokument-Collection aus einer Datei mit JSON-Daten erstellen, wie die von häufig verwendeten NoSQL-Datenbanken (einschließlich Oracle NoSQL Database) erstellten Daten.
Wenn Sie ejson
als Wert des Parameters type
der Prozedur verwenden, werden erkannte erweiterte JSON-Objekte in der Eingabedatei durch entsprechende skalare Werte in der resultierenden nativen binären JSON-JSON-Collection ersetzt. Umgekehrt können Sie die Funktion json_serialize
mit dem Schlüsselwort EXTENDED
verwenden, um skalare Werte durch erweiterte JSON-Objekte in den resultierenden JSON-Textdaten zu ersetzen.
Im Folgenden sind die beiden wichtigsten Anwendungsfälle für erweiterte Objekte aufgeführt:
-
Austausch (Import/Export):
-
Aufnahme vorhandener JSON-Daten (egal von wo), die erweiterte Objekte enthalten.
-
Serialisierung nativer binärer JSON-Daten als JSON-Textdaten mit erweiterten Objekten zur Verwendung außerhalb der Datenbank.
-
-
Prüfung nativer binärer JSON-Daten: Prüfen Sie den Datenbestand, indem Sie die entsprechenden erweiterten Objekte anzeigen.
Zu Austauschzwecken können Sie JSON-Daten aus einer Datei aufnehmen, die von häufig verwendeten NoSQL-Datenbanken erzeugt wird, einschließlich Oracle NoSQL Database. Dabei werden erweiterte Objekte in native binäre JSON-Skalare konvertiert. Umgekehrt können Sie native binäre JSON-Daten als Textdaten exportieren und dabei Oracle-spezifische skalare JSON-Werte durch entsprechende erweiterte JSON-Textobjekte ersetzen.
Tipp:
Beispiel für eine Prüfung: Betrachten wir ein Objekt wie {"dob" : "2000-01-02T00:00:00"}
als Ergebnis der Serialisierung nativer JSON-Daten. Ist "2000-01-02T00:00:00"
das Ergebnis der Serialisierung eines nativen Binärwerts vom Typ "date", oder ist der native Binärwert nur eine Zeichenfolge? Dies können Sie durch Verwendung von json_serialize
mit dem Schlüsselwort EXTENDED
herausfinden.
Die Zuordnung von erweiterten Objektfeldern zu skalaren JSON-Typen erfolgt im Allgemeinen von vielen zu eins: Mehrere Arten von erweiterten JSON-Objekten können einem bestimmten skalaren Wert zugeordnet werden. Beispiel: Die erweiterten JSON-Objekte {"$numberDecimal":"31"}
und {"$numberLong:"31"}
werden beide als Wert 31 des skalaren Typs "Nummer" in JSON-Sprache übersetzt, und die Elementmethode type()
gibt "number"
für jedes dieser JSON-Skalare zurück.
Die Elementmethode type()
meldet den skalaren Typ der JSON-Sprache für den Zielwert (als JSON-Zeichenfolge). Einige skalare Werte sind intern unterscheidbar, selbst wenn sie denselben skalaren Typ aufweisen. Dadurch kann die Funktion json_serialize
(mit dem Schlüsselwort EXTENDED
) das ursprüngliche erweiterte JSON-Objekt in der Regel rekonstruieren. Solche skalaren Werte werden intern entweder durch Verwendung von verschiedenen SQL-Typen bei ihrer Implementierung oder durch Tagging mit dem Typ des erweiterten JSON-Objekts unterschieden, von dem sie abgeleitet wurden.
Wenn json_serialize
das ursprüngliche erweiterte JSON-Objekt neu erstellt, ist das Ergebnis nicht immer textuell mit dem Original identisch, jedoch immer semantisch äquivalent. Beispiel: {"$numberDecimal":"31"}
und {"$numberDecimal":31}
sind semantisch gleichwertig, auch wenn sich der Typ der Feldwerte (Zeichenfolge und Zahl) unterscheidet. Sie werden in denselben internen Wert übersetzt, wobei jeder Wert als von einem erweiterten $numberDecimal
-Objekt abgeleitet getaggt wird (gleiches Tag). Wenn sie jedoch serialisiert werden, lautet das Ergebnis für beide {"$numberDecimal":31}
. Oracle verwendet immer den unmittelbar relevanten Typ für den Feldwert (in diesem Fall den JSON-Sprachwert 31
) des skalaren Typs "number".
Tabelle - Zeigt Entsprechungen zwischen den verschiedenen verwendeten Typen an. Die Zuordnung erfolgt über (1) erweiterte Objekttypen, die als Eingabe verwendet werden, (2) von der Elementmethode type()
gemeldete Typen, (3) intern verwendete SQL-Typen, (4) standardmäßige JSON-Sprachtypen, die als Ausgabe der Funktion json_serialize
verwendet werden, und (5) erweiterte Objekttypen, die von json_serialize
bei Angabe des Schlüsselwortes EXTENDED
ausgegeben werden.
Tabelle - Beziehungen zwischen erweiterten JSON-Objekttypen
Erweiterter Objekttyp (Eingabe) | Skalarer Oracle JSON-Typ (gemeldet von type()) | Skalarer SQL-Typ | Skalarer JSON-Standardtyp (Ausgabe) | Erweiterter Objekttyp (Ausgabe) |
---|---|---|---|---|
$numberDouble mit einer JSON-Zahl, einer Zeichenfolge für die Zahl oder einer der folgenden Zeichenfolgen als Wert: "Infinity" , "-Infinity" , "Inf" , "-Inf" , "Nan" Foot 1
|
double (Double-Datentyp) | BINARY_DOUBLE |
Zahl |
$numberDouble mit einer JSON-Nummer oder einer der folgenden Zeichenfolgen als Wert: "Inf" , "-Inf" , "Nan" Fußnote 2 |
$numberFloat mit demselben Wert wie für $numberDouble |
Fließkomma | BINARY_FLOAT |
Zahl |
$numberFloat mit demselben Wert wie für $numberDouble |
$numberDecimal mit demselben Wert wie für $numberDouble |
Zahl | NUMBER |
Zahl |
$numberDecimal mit demselben Wert wie für $numberDouble |
$numberInt mit einer signierten 32-Bit-Ganzzahl oder einer Zeichenfolge, die für die Zahl steht, als Wert
|
Zahl | NUMBER |
Zahl |
$numberInt mit demselben Wert wie für $numberDouble |
$numberLong mit einem Wert einer JSON-Nummer oder einer Zeichenfolge, die für die Zahl steht
|
Zahl | NUMBER |
Zahl |
$numberLong mit demselben Wert wie für $numberDouble |
Wenn der Wert eine Zeichenfolge mit base64-Zeichen ist, kann das erweiterte Objekt auch das Feld |
binär | BLOB oder RAW |
string (Zeichenfolgendatentyp) Die Konvertierung entspricht der Verwendung der SQL-Funktion |
Eine der folgenden Optionen:
|
$oid mit einer Zeichenfolge aus 24 Dezimalzeichen als Wert
|
binär | RAW(12) |
string (Zeichenfolgendatentyp) Die Konvertierung entspricht der Verwendung der SQL-Funktion |
$rawid mit einer Zeichenfolge aus 24 Dezimalzeichen als Wert
|
$rawhex mit einer Zeichenfolge mit einer geraden Anzahl von Hexadezimalzeichen als Wert
|
binär | RAW |
string (Zeichenfolgendatentyp) Die Konvertierung entspricht der Verwendung der SQL-Funktion |
$binary mit einer Zeichenfolge aus base64-Zeichen als Wert, die rechts mit = -Zeichen aufgefüllt ist
|
$rawid mit einer Zeichenfolge aus 24 oder 32 Hexadezimalzeichen als Wert
|
binär | RAW |
string (Zeichenfolgendatentyp) Die Konvertierung entspricht der Verwendung der SQL-Funktion |
$rawid |
$oracleDate mit Wert einer ISO 8601-Datumszeichenfolge
|
Datum | DATE |
string (Zeichenfolgendatentyp) |
$oracleDate mit Wert einer ISO 8601-Datumszeichenfolge
|
$oracleTimestamp mit Wert einer ISO 8601-Zeitstempelzeichenfolge
|
Zeitstempel | TIMESTAMP |
string (Zeichenfolgendatentyp) |
$oracleTimestamp mit Wert einer ISO 8601-Zeitstempelzeichenfolge
|
$oracleTimestampTZ mit einer ISO 8601-Zeitstempelzeichenfolge mit einem numerischen Zeitzonen-Offset oder mit Z als Wert |
Zeitstempel mit Zeitzone | TIMESTAMP WITH TIME ZONE |
string (Zeichenfolgendatentyp) |
$oracleTimestampTZ mit einer ISO 8601-Zeitstempelzeichenfolge mit einem numerischen Zeitzonen-Offset oder mit Z als Wert |
|
Zeitstempel mit Zeitzone | TIMESTAMP WITH TIME ZONE |
string (Zeichenfolgendatentyp) |
$oracleTimestampTZ mit einer ISO 8601-Zeitstempelzeichenfolge mit einem numerischen Zeitzonen-Offset oder mit Z als Wert |
$intervalDaySecond mit einer ISO 8601-Intervallzeichenfolge, wie für die SQL-Funktion to_dsinterval angegeben, als Wert |
daysecondInterval | INTERVAL DAY TO SECOND |
string (Zeichenfolgendatentyp) |
$intervalDaySecond mit einer ISO 8601-Intervallzeichenfolge, wie für die SQL-Funktion to_dsinterval angegeben, als Wert |
$intervalYearMonth mit einer ISO 8601-Intervallzeichenfolge, wie für die SQL-Funktion to_yminterval angegeben, als Wert |
yearmonthInterval | INTERVAL YEAR TO MONTH |
string (Zeichenfolgendatentyp) |
$intervalYearMonth mit einer ISO 8601-Intervallzeichenfolge, wie für die SQL-Funktion to_yminterval angegeben, als Wert |
Zwei Felder:
|
Vektor | VECTOR |
Zahlenarray |
Zwei Felder:
|
Fußnote 1 Die Zeichenfolgewerte werden ohne Berücksichtigung der Groß-/Kleinschreibung interpretiert. Beispiel: "NAN"
"nan"
und "nAn"
werden akzeptiert und sind äquivalent, genau wie die Werte "INF"
, "inFinity"
und "iNf"
. Unendlich große Zahlen ("Infinity"
oder "Inf"
) und kleine Zahlen ("-Infinity"
oder "-Inf"
) werden mit dem vollständigen Wort oder der Abkürzung akzeptiert.
Fußnote 2 Bei der Ausgabe werden nur diese Zeichenfolgenwerte verwendet - vollständige Wörter (Infinity) oder Varianten in Groß- und Kleinschreibung sind nicht zulässig.