2008-09-01 65 views
11

Nếu bạn tạo một dblink Oracle, bạn không thể truy cập trực tiếp các cột LOB trong các bảng mục tiêu.Cách tốt nhất để xử lý các LOB trong cơ sở dữ liệu phân tán Oracle

Ví dụ, bạn tạo một dblink với:

create database link TEST_LINK 
    connect to TARGETUSER IDENTIFIED BY password using 'DATABASESID'; 

Sau này bạn có thể làm công cụ như:

select column_a, column_b 
from [email protected]_LINK 

Trừ nếu cột là một LOB, sau đó bạn nhận được lỗi:

ORA-22992: cannot use LOB locators selected from remote tables 

Đây là a documented restriction.

Trang cùng gợi ý bạn lấy các giá trị vào một bảng địa phương, nhưng đó là ... loại lộn xộn:

CREATE TABLE tmp_hello 
AS SELECT column_a 
from [email protected]_LINK 

Bất cứ ý tưởng khác?

Trả lời

4

Vâng, thật là lộn xộn, tôi không thể nghĩ ra cách để tránh nó.
Bạn có thể ẩn một số sự lộn xộn của khách hàng bằng cách đặt bảng tạm thời trong một thủ tục được lưu trữ (và sử dụng "thực thi ngay lập tức" để tạo bảng)
Một điều bạn cần lưu ý là để lại trên bảng tạm thời (nên một cái gì đó thất bại một nửa thông qua một phiên, trước khi bạn đã có thời gian để làm sạch nó lên) - bạn có thể lên lịch một công việc oracle để định kỳ chạy và loại bỏ bất kỳ còn lại trên bàn.

0

Bạn có lưu ý một kịch bản cụ thể không? Ví dụ, nếu LOB giữ các tệp và bạn đang ở trên mạng nội bộ của công ty, có lẽ bạn có thể viết một thủ tục được lưu trữ để trích xuất các tệp vào thư mục đã biết trên mạng và truy cập chúng từ đó.

0

Trong trường hợp cụ thể này, cách duy nhất mà hai hệ thống có thể giao tiếp là sử dụng dblink.

Ngoài ra, giải pháp bảng không phải là khủng khiếp, nó chỉ là lộn xộn để có "bộ nhớ cache" dữ liệu trên mặt của tôi của dblink.

1

Bạn có thể sử dụng các chế độ xem theo phương pháp thừa kế để xử lý tất cả quản lý "bộ nhớ cache". Nó không hoàn hảo nhưng làm việc trong hầu hết các trường hợp :)

8

Giải pháp tốt nhất bằng cách sử dụng một truy vấn như dưới đây, nơi column_b là một BLOB:

SELECT (select column_b from [email protected]_LINK) AS column_b FROM DUAL 
+3

Điều đó hoạt động như một sự quyến rũ !!! Câu trả lời hay nhất trên internet! – gabrjan

+0

@ user2015502 bạn đã thử công thức này trong công thức Hibernate? nó đáp ứng luôn luôn như bảng không tìm thấy và tôi đã có truy vấn của tôi làm việc trong nhà phát triển – eduyayo

+0

Cảm ơn bạn đã truy vấn nhưng nó không làm việc cho tôi. Những gì tôi nhận được là một BLOB với kích thước 0. Phương thức này cũng cần lựa chọn bên trong để lọc: 'truy vấn con đơn hàng trả về nhiều hơn một hàng'. – detoro84

0

Đối với dữ liệu truy vấn, các giải pháp của user2015502 là thông minh nhất . Nếu bạn muốn chèn hoặc cập nhật AT của cơ sở dữ liệu từ xa (chèn vào xxx @ yyy ...), bạn có thể dễ dàng sử dụng SQL động cho điều đó. Xem my solution here:

Các vấn đề liên quan