Zugriff auf Daten, die mit dem Namen in SQL*Loader control-Datei
Wie kann ich den Zugriff auf die Eingabe-Daten-Datei-name in SQL*Loader control-Datei, so dass ich stecken Sie es in die Tabelle zusammen mit den Daten aus der input-Datei?
Zum Beispiel, sagen wir ich habe folgenden Steuerelement-Datei:
LOAD DATA
APPEND
INTO TABLE STG_AM02_BA_RAW
WHEN (1:2) = 'DT'
(
SUBSCRIBER_NO POSITION(11:18)CHAR,
ACCOUNT_NO POSITION(19:32)CHAR,
SUBSCRIBER_NAME POSITION(33:92)CHAR
)
Ich möchte etwas machen wie:
LOAD DATA
APPEND
INTO TABLE STG_AM02_BA_RAW
WHEN (1:2) = 'DT'
(
SUBSCRIBER_NO POSITION(11:18)CHAR,
ACCOUNT_NO POSITION(19:32)CHAR,
SUBSCRIBER_NAME POSITION(33:92)CHAR,
INPUTFILE INPUTFILENAME()CHAR
)
Davon ausgehen, dass ich keinen Zugriff habe, noch die Berechtigung zum Bearbeiten der shell-Skript wird aufgerufen, SQL*Loader, das mit diesem Steuerelement-Datei.
InformationsquelleAutor Lukman | 2009-11-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als der 11g, es ist nicht möglich, den Dateinamen direkt aus der SQL*Loader control-Datei.
Sie haben im Grunde handle es sich aus Ihrer Skripting-Umgebung.
Wenn Sie nicht in der Lage, ändern Sie das Skript laden, vielleicht könnten Sie fügen Sie eine header-record, Datenfile?
Es sieht aus wie Sie einen Datensatz-Typ-Feld in Stellung 1:2 - können Sie ändern die Datei-Erstellung, um einen Dateinamen record-Typ?
Beispielsweise eine "FN" - Datentyp:
Ihre load-Skript könnte dann ändern zu:
Alles hängt davon ab, ob Sie aktualisieren die Daten-Datei...
Beispielsweise
Wenn Sie brauchen, um die Referenz mit dem Namen gegen jede Datenzeile, die Sie laden können die Daten in mehrere staging-Tabellen:
... und nehmen Sie Sie zusammen mit SQL:
Dieser Prozess fällt, wenn Sie gleichzeitige Belastungen.
Sie sagte in den Kommentaren, die Sie ändern können die Daten-Datei - könnte man sich die Datei geändert, dass die Dateinamen angefügt, um jeden Datensatz? Wenn dem so ist, macht das Problem Weg. Sie würde lediglich zu enthalten:
owh warten, bevor ich kreuzen Sie Ihre Antwort, wie kann ich den Dateinamen in jedem insert in die Tabelle? da der sql*loader ist die Verarbeitung der Zeile eins nach dem anderen, ist es möglich zu tun Rückbezug zu vorherigen Zeile?
Können Sie laden die Daten in zwei staging-Tabellen kombinieren Sie Sie dann in der letzten Last-Tabelle? Ich werde auch ein Beispiel in meiner Antwort.
vielen Dank für das Beispiel. das problem ist, dass es Millionen Datensatz in einer Datei und ich bekomme Sie mindestens 4-Dateien von externen Systemen verarbeitet werden, eine nach der anderen. somit wäre es nicht effizient, um fügen Sie der Datei den Namen, um jeden Datensatz, und ich kann nicht Fragen, die Jungs auf dem externen Systemen um es in den ersten Platz. auch kann ich nicht die "Last in mehrere staging-Tabellen, und fügen Sie Sie zusammen" trick weil ich habe 4 Dateien, mit 4 unterschiedlichen Namen werden nacheinander geladen (d.h. ohne Reinigung der staging-Tabelle). wie kann ich sicherstellen, dass die join-ordnet die Datensätze korrekt?
nvm ich dachte es mir. Ich legen Sie den Dateinamen in der 'FN' - Zeile in eine separate Tabelle, und erstellen Sie eine
BEFORE INSERT
trigger holt den Dateinamen und in die eingefügten Zeilen. Was für ein Kreisverkehr Weg, es zu tun, kann aber nicht helfen, es mit der Einschränkung in SQL*Loader (gut, es heißt "control file' und nicht 'script' für einen Grund).InformationsquelleAutor Nick Pierpoint
Ich glaube nicht, dass es einen Weg gibt, um diese in den Umständen, die Sie angegeben haben, AFAIK gibt es keine Möglichkeit, um richtig zu referenzieren Sie den Dateinamen in das "Daten" - Teil.
Paar Ideen für einen workaround:
Haben Sie die batch-Datei bauen die control-Datei, um den Dateinamen als Konstante, so könnte man etwas wie
INPUTFILE KONSTANTE "my_data.dat"
Hoffe, das hilft.
INPUTFILE CONSTANT "my_data.dat"
wird nicht funktionieren, weil der control-Datei ist wohl zu akzeptieren-Eingabedatei Namen von der Befehlszeile aus.InformationsquelleAutor Thorsten
Den einfachen Weg, dieses Thema anzugehen ist, indem Sie eine extra Spalte am Ende der jeder Datensatz mit dem Namen und der Karte, die Spalte position auf das Feld.
InformationsquelleAutor Nash