문제

두 개의 스키마 : A와 B (Oracle 9)가 있습니다. A에는 B에 DBLINK가 있습니다. B에는 패키지가 있습니다.

create type B.tr_rad as object (
  name     varchar2(64)
 ,code     number
 ,vendor   number
 ,val      varchar2(255)
 ,num      number
);

create type B.tt_rad as varray(256) of B.tr_rad;

그러나 계획에서 DBLINK에서 SQL 유형을 사용하는 것은 지원되지 않기 때문에 TT_RAD 유형을 사용할 수 없습니다. DBMS_SQL은 지원되는 커서가 아닙니다. 동일한 OID를 가진 유형을 만듭니다.

임시 테이블을 사용한다고 생각합니다. 그러나 먼저 그렇게 좋지 않습니다 (원격 기능이 값을 반환 한 후에는 호출 측면이 원격 테이블에서 수집을 선택해야합니다). 그리고 임시 테이블과의 작업 둔화에 대한 두려움이 있습니다.

어쩌면 누가 대체 상호 작용을 아는가?

도움이 되었습니까?

해결책

과거에는 비슷한 문제가있었습니다. 그런 다음 기본적으로 Oracle의 DB 링크가 간단한 SQL 유형 (특히 UDT, 클로브에는 문제가있을 수 있음, XMLType도 마찬가지)에 대해 "파손"한다는 결론에 도달했습니다. OID 솔루션을 작동시킬 수 있다면 행운을 빕니다.

내가 의지하는 솔루션은 DB 링크 대신 Java 저장 절차를 사용하는 것이 었습니다.

Java 저장 절차의 특성 :

  1. "풍부한 유형 세트"를 반환 할 수 있습니다. 오라클 온라인 문서 자세한 내용은. Oracle은 DBLINK보다 Java의 복잡한 유형 (또는 풍부한) 유형의 마샬링하는 작업을 훨씬 더 잘 수행합니다.
  2. 저장된 Java는 "기본 연결"을 획득 할 수 있습니다 (DB에 대한 SQL 연결과 동일한 세션에서 실행됩니다 - 인증 문제 없음).
  3. 저장된 Java는 원격 DB에서 PL/SQL Proc를 호출하고 Java JDBC 층은 원격 DB에서 마샬링을합니다.
  4. 저장된 Java는 결과를 포장하고 결과를 SQL 또는 PL/SQL 층으로 반환합니다.

약간의 작업이지만 약간의 Java가 있다면 Oracle 문서 및 샘플에서 솔루션을 "잘라 내고 붙여 넣을 수 있습니다.

이게 도움이 되길 바란다.

다른 팁

대안적인 상호 작용은 하나 데이터베이스 링크가있는 두 개의 데이터베이스 대신 Schemas A 및 B가있는 데이터베이스.

내 해결책. 쪽 컬렉션 레코드와 같은 임시 테이블을 만듭니다. 에서 측면 DBMS_SQL 래퍼가 있습니다. 이 절차는 임시 테이블에 결과 컬렉션을 작성합니다. 완료 후 원격 절차를 성공적으로 완료 한 후 원격 임시 테이블에서 결과를 선택하여 로컬 컬렉션 유형으로 변환합니다.

제한 사항 1. 영구 객체 동기화의 필요성. 2. 불가능성 SQL 쿼리에서 A 측 절차 (원격 절차를 호출)를 사용합니다. 3. 사용의 복잡성.

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