Oracle 분산 데이터베이스에서 LOB를 처리하는 가장 좋은 방법
-
09-06-2019 - |
문제
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의 내 쪽에서 데이터를 "캐시"해야 한다는 것은 단지 지저분한 것입니다.