Tại sao tôi không thể đọc các cột CLOB của Oracles qua máy chủ được liên kết SQL-SERVER 2008?


10

Tôi muốn truy cập dữ liệu trong cơ sở dữ liệu Oracle 11g từ SQL-Server 2008

Tôi đã thiết lập một máy chủ được liên kết và khi tôi thực thi

select * from [Link_server_name]..Oracle_schema.Oracle_table

và Oracle_table chứa các cột Số và varchar2, tất cả đều hoạt động như ngoại lệ.

Nhưng khi Oracle_table chứa cột CLOB, tôi gặp lỗi sau:

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Lỗi không xác định' zurückgeben.

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Đã xảy ra lỗi Oracle, nhưng không thể truy xuất thông báo lỗi từ Oracle.' zurückgeben.

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Kiểu dữ liệu không được hỗ trợ.' zurückgeben.

Msg 7306, Cấp 16, Bang 2, Dòng 1

Chết "" MCCAPP ".

Sử dụng MỞ

SELECT * FROM OPENQUERY([L_V407SR8T], 'Select CLOB_COLUMN from Oracle_table'  )

tôi có

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Đã xảy ra lỗi Oracle, nhưng không thể truy xuất thông báo lỗi từ Oracle.' zurückgeben. Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Kiểu dữ liệu không được hỗ trợ.' zurückgeben.

Xin thứ lỗi thông báo lỗi tiếng Đức.

Câu hỏi của tôi: Có cách nào để đọc các cột CLOB thông qua Máy chủ được liên kết không?

BIÊN TẬP:

  • Thuật sĩ Nhập và Xuất SQL Server dường như cũng phụ thuộc vào OLE DB và hút vào cùng một bảng
  • Tôi tự hỏi mình, nếu vấn đề phụ thuộc vào cách sử dụng bộ ký tự, nhưng tôi không thể thay đổi chúng
  • Khi làm việc thực tế, tôi sử dụng một số tập lệnh PowerShell để lấy dữ liệu, nhưng

Bạn sẽ có thể đọc CLOB nếu ít nhất bạn có thể chuyển đổi nó trước tiên ... msdn.microsoft.com/en-us/l
Library / ms378813.aspx

Câu trả lời:


3

Tải xuống và cài đặt máy khách cơ sở dữ liệu Oracle 11 trên máy SQL Server 2008 của bạn.

Thiết lập máy chủ được liên kết bằng nhà cung cấp Oracle OLE DB (OraOLEDB.Oracle).

Đảm bảo "Cho phép InProcess" được bật trong tùy chọn Nhà cung cấp.

Máy khách Oracle 11 OLE DB hỗ trợ CLOB.


2

Nhận xét cho câu trả lời Câu hỏi SO Làm thế nào để đọc cột CLOB trong Oracle bằng OleDb?

chứa một liên kết đến bài đăng Hỗ trợcủa Microsoft với tuyên bố sau

Các loại dữ liệu dành riêng cho Oracle 8.x, như CLOB, BLOB, BFILE, NCHAR, NCLOB và NVARCHAR2, không được hỗ trợ.

Nó sẽ được tốt đẹp để tìm thấy một số tài liệu tham khảo hiện tại.

Tôi đã làm một số nghiên cứu của Google và chỉ tìm thấy cách giải quyết. Tôi sợ kiểu dữ liệu vẫn không được hỗ trợ.

Chỉnh sửa 02/05/2011

Tôi thực sự không hiểu tại sao Microsoft không thể khắc phục vấn đề này. Tập lệnh PowerShell sau đây sử dụng OLE-DB để đọc bảng chứa cột CLOB từ cơ sở dữ liệu Oracle và chèn dữ liệu vào một bảng tương tự hiện có trên Sql-Server bằng cách sử dụng hàng loạt, đây là một cách rất hiệu quả.

Điều chỉnh các chuỗi kết nối, truy vấn và tên bảng sau đây để cài đặt của bạn:

# Here I use OLE-DB to read the Oracle database
$ConnectionString ="Server=ignore;User Id=myUser;Password=myPassword;Data Source=myTns;Provider=OraOLEDB.Oracle;"

# Here I use .NET SqlClient
$SqlClientConnString = "Data Source=localhost;Initial Catalog=myDestinationDB;Integrated Security=True"

$sql = "select int_col, clob_col from TABLE_WITH_CLOB"
$tableName = "COPY_OF_CLOB_TABLE"

Đoạn mã sau sao chép bảng oracle vào bảng máy chủ sql

$OLEDBConn = New-Object System.Data.OleDb.OleDbConnection($ConnectionString)
$OLEDBConn.open()
$readcmd = New-Object system.Data.OleDb.OleDbCommand($sql,$OLEDBConn)
$readcmd.CommandTimeout = '300'
$da = New-Object system.Data.OleDb.OleDbDataAdapter($readcmd)
$dt = New-Object system.Data.datatable
[void]$da.fill($dt)
$OLEDBConn.close()
#Write-Output $dt


if ($dt)
{
    try
    {
        $bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $SqlClientConnString
        $bulkCopy.DestinationTableName = $tableName
        $bulkCopy.BatchSize = 50000
        $bulkCopy.BulkCopyTimeout = 0
        $bulkCopy.WriteToServer($dt)
    }
    catch
    {
        $ex = $_.Exception
        #Write-LogMessage -Source 'Write-DataTable' -Message "$($connectionName):$ex.Message"
        Write-Error "Write-DataTable$($connectionName):$ex.Message"
        continue
    }
}

BTW: mã dựa trên dự án mã hóa từ điển dữ liệu thực sự đơn giản của Chad Millers

Hiện tại sử dụng PowerShell là cách duy nhất tôi biết để sao chép Dữ liệu bằng CLOB từ Oracle sang Sql-Server không sử dụng C # hoặc bất kỳ công cụ của bên thứ ba nào.

Tôi đã không thành công khi sử dụng cả Trình hướng dẫn Nhập / Xuất cũng như máy chủ được liên kết.


Grrrr thật tệ khi xem xét đó là bản phát hành ba điểm cho ORA và ít nhất một bản phát hành điểm cho MS kể từ đó ... AHANo new updates are planned for future releases of these components including their support against versions later than Oracle 8i.
jcolebrand

Tôi thực sự không hiểu tại sao Microsoft không thể khắc phục vấn đề này ? Vì lý do tương tự, Microsoft đã ngừng hỗ trợ khung dotnet Thư viện máy khách Oracle - "những người khác làm điều đó tốt hơn", nếu tôi diễn giải một cách tàn nhẫn những phản hồi của họ trong quá khứ. Không có tình yêu bị mất giữa hai người, tôi nói với bạn.
ScottCher
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.