문제

Oracle dblink를 생성하면 대상 테이블의 LOB 열에 직접 액세스할 수 없습니다.

예를 들어 다음을 사용하여 dblink를 만듭니다.

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

그 후에는 다음과 같은 작업을 수행할 수 있습니다.

select column_a, column_b 
from data_user.sample_table@TEST_LINK

열이 LOB인 경우를 제외하고 오류가 발생합니다.

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

이것은 문서화된 제한.

같은 페이지에서는 값을 로컬 테이블로 가져오라고 제안하지만 이는...좀 지저분하다:

CREATE TABLE tmp_hello 
AS SELECT column_a 
from data_user.sample_table@TEST_LINK

다른 아이디어가 있나요?

도움이 되었습니까?

해결책

네, 지저분합니다. 그래도 피할 수 있는 방법이 생각나지 않습니다.
임시 테이블 생성을 저장 프로시저에 넣고 "즉시 실행"을 사용하여 테이블을 생성하면 클라이언트에서 지저분한 부분을 숨길 수 있습니다.
주의해야 할 한 가지는 임시 테이블이 남아 있다는 것입니다(세션 중간에 무언가 실패할 경우 정리할 시간을 갖기 전에). Oracle 작업을 정기적으로 실행하고 남은 테이블을 제거하도록 예약할 수 있습니다. .

다른 팁

아래와 같이 쿼리를 사용하는 것이 가장 좋은 솔루션입니다. 여기서 column_b는 BLOB입니다.

SELECT (select column_b from sample_table@TEST_LINK) AS column_b FROM DUAL

모든 "캐시" 관리를 처리하기 위해 구체화된 뷰를 사용할 수 있습니다.완벽하지는 않지만 대부분의 경우 작동합니다 :)

쿼리 데이터의 경우 user2015502의 솔루션이 가장 똑똑합니다.LOB를 삽입하거나 업데이트하려는 경우 원격 데이터베이스(xxx@yyy에 삽입 ...)에는 동적 SQL을 쉽게 사용할 수 있습니다.보다 내 솔루션은 다음과 같습니다.

염두에 두고 있는 특정 시나리오가 있나요?예를 들어 LOB에 파일이 있고 회사 인트라넷에 있는 경우 저장 프로시저를 작성하여 네트워크의 알려진 디렉터리에 파일을 추출하고 거기에서 액세스할 수 있습니다.

이 특별한 경우에 두 시스템이 통신할 수 있는 유일한 방법은 dblink를 사용하는 것입니다.

또한, 테이블 솔루션은 그다지 끔찍하지 않습니다. dblink의 내 쪽에서 데이터를 "캐시"해야 한다는 것은 단지 지저분한 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top