2011-09-13 13 views
7

È possibile utilizzare una voce TNS pienamente qualificata utilizzando sqlldr in bundle con Oracle 10/11?È possibile che Oracle sqlldr accetti una voce TNS come qualificatore di istanza in Oracle 10 e 11?

Per esempio, in SQLPlus:

sqlplus user/[email protected](description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl))) @script.sql 

Ma usando sqlldr (SQL Loader) non sembrano essere problemi con l'utilizzo direttamente la voce di TNS. In particolare:

sqlldr user/[email protected](description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl))) bad='bad_file.txt' control='control.ctl' data='data.txt' log='log.txt' direct='true' 

Ecco il messaggio di errore prodotto:

LRM-00116: syntax error at 'address' following '(' 

    SQL*Loader: Release 11.2.0.1.0 - Production on Tue Sep 13 15:41:54 2011 

    Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. 

    SQL*Loader-100: Syntax error on command-line 

Il tentativo di incapsulare la voce TNS tra virgolette produce lo stesso errore.

Ha dato un'occhiata alla documentazione di sqlldr e ha tentato di utilizzare l'argomento della riga di comando 'userid' inutilmente. In particolare:

sqlldr userid='user/[email protected](description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl)))' bad='bad.txt' control='control.ctl' data='data.txt' log='log.txt' direct='true' 
LRM-00116: syntax error at '[email protected](' following '=' 

SQL*Loader: Release 11.2.0.1.0 - Production on Tue Sep 13 15:44:17 2011 

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. 

SQL*Loader-100: Syntax error on command-line 

Ha senso che Oracle spera di costringere l'utente a un'istanza locale per mitigare I/O nello spingere i dati a un host remoto. Ma la deviazione nella sintassi supportata non è così intuitiva. Qualcun altro ha problemi simili?

risposta

3

Hai provato il formato ezconnect per connetterti a un db remoto usando sqlldr?

esempio:

sqlldr user/[email protected]//localhost:1521/orcl bad='bad_file.txt' control='control.ctl' data='data.txt' log='log.txt' direct='true' 

vedi: http://www.orafaq.com/wiki/EZCONNECT

1

Si può anche provare:

sqlldr user/[email protected]:(description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl))) bad='bad_file.txt' control='control.ctl' data='data.txt' log='log.txt' direct='true' 
+0

ottengo lo stesso errore, senza il "TNS : " – leo

3

Sembra che avete bisogno di sfuggire personaggi come (,) e = con il carattere di escape \ come spiegato in here

6

fwiw, questo ragazzo poste d una soluzione a questo problema

http://www.simplemancomplexmachine.com/2011/10/sqlldr-one-liner-to-remote-database.html

Yes there is a one-line solution and you can use a TNS connect string to do this from the command line. The key is formatting the connection string a little different as it must be quoted. Additionally the quotes and parentheses must be escaped (backslashes):

sqlldr [email protected]\"\(description=\(address=\(host=remote.db.com\)\(protocol=tcp\)\(port=1521\)\)\(connect_data=\(sid=dbsid\)\)\)\"/dbpass control=controlfilename.ctl data=data.csv 

Si noti che nel post del blog originale aveva uno spazio di fronte a '/ dbpass'. Questo fa sì che sqlldr per dare l'errore:

LRM-00112: più valori non consentiti per il parametro 'userid'

+0

Sono anche sfuggito ai caratteri '=' e ha funzionato. Non ha provato senza uscire da '=' come nell'esempio precedente ... – Wouter

0

L'unica cosa che ha funzionato per me stava usando due tipi di citazioni:

sqlldr user/[email protected]'"(description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl)))"' bad='bad_file.txt' control='control.ctl' data='data.txt' log='log.txt' direct='true'

+0

Non ha funzionato per me, stesso errore ... – Wouter

-1

Kelvin è corretto al 100%. Ha funzionato per me

è possibile eseguire SQL CARICATORE CON COMANDO SOTTO senza fare un INGRESSO TNS

sqlldr userid/password @ // host: port/SERVICE_NAME cattivo = '//PATH FILENAME.bad' di controllo =' /PATH/FILENAME.ctl 'data ='/PATH/FILENAME.csv 'log ='/PATH/FILENAME.log'= diretti 'true'

0

singolo citando il tutto non-così-EZConnect ha lavorato per me in uno script batch DOS e sulla riga di comando:

sqlldr 'user/[email protected](description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl)))' control='control.ctl' data='data.txt' 
Problemi correlati