2011-09-13 13 views
7

Có thể sử dụng mục nhập TNS đủ điều kiện bằng sqlldr đi kèm với Oracle 10/11 không?Có thể cho Oracle sqlldr chấp nhận một mục nhập TNS như một trình độ thể hiện trong Oracle 10 và 11 không?

Ví dụ, trong sqlplus:

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

Nhưng sử dụng sqlldr (SQL Loader) có vẻ như là vấn đề với việc sử dụng các mục nhập TNS trực tiếp. Cụ thể là:

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' 

Dưới đây là thông báo lỗi sản xuất:

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 

Cố gắng để đóng gói các mục TNS trong dấu ngoặc kép tạo ra lỗi tương tự.

Đã xem tài liệu sqlldr và cố gắng sử dụng đối số dòng lệnh 'userid' để không có kết quả. Cụ thể:

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 

Có ý nghĩa rằng Oracle hy vọng sẽ ép buộc người dùng vào một cá thể cục bộ để giảm thiểu I/O trong việc đẩy dữ liệu đến máy chủ từ xa. Nhưng độ lệch trong cú pháp được hỗ trợ không trực quan lắm. Bất kỳ ai khác cũng gặp phải sự cố tương tự?

Trả lời

3

Bạn đã thử định dạng ezconnect để kết nối với một db từ xa bằng sqlldr chưa?

ví dụ:

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

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

1

Bạn cũng có thể thử:

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

tôi nhận được lỗi tương tự như nếu không có sự "TNS : " – leo

3

Hình như bạn cần phải thoát khỏi nhân vật như (,) và = với các ký tự thoát \ như được giải thích trong here

6

fwiw, anh chàng này đã đăng d một giải pháp cho vấn đề này

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 

Lưu ý rằng trong bài đăng blog ban đầu ông đã có một không gian ở phía trước '/ dbpass'. Điều này gây ra sqlldr để cung cấp cho các lỗi:

LRM-00112: nhiều giá trị không được phép cho tham số 'userid'

+0

Tôi cũng đã thoát ký tự '=' và nó hoạt động. Đã không kiểm tra mà không thoát '=' như trong ví dụ trên ... – Wouter

0

Điều duy nhất mà làm việc đối với tôi là sử dụng hai loại dấu ngoặc kép:

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

Không hoạt động cho tôi, cùng một lỗi ... – Wouter

-1

Kelvin chính xác 100%. Nó làm việc cho tôi

bạn có thể thực SQL Loader VỚI COMMAND DƯỚI KHÔNG LÀM Một ENTRY TNS

sqlldr userid/mật khẩu @ // host: port/SERVICE_NAME xấu = '/ PATH/FILENAME.bad' kiểm soát =' /PATH/FILENAME.ctl 'data ='/PATH/FILENAME.csv 'log ='/PATH/FILENAME.log' trực tiếp = 'true'

0

Độc trích dẫn toàn bộ không-để-ezconnect làm việc cho tôi trong một loạt kịch bản DOS và trên dòng lệnh:

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