2014-05-21 2 views
1

DB 링크를 통해 참조 유형을 전달하려고 시도하지만 프로 시저의 DB 링크에 대한 잘못된 참조를 알려주고 있습니다. 패키지의 본문과 사양에 지정 했으므로 해결책을 찾은 후 해결 방법을 모르겠습니다. 11g oracle DB에 대한 참조 유형으로 oracle 10g를 사용하고 있습니다.DB 링크를 통해 참조 유형 전달

버전 : 오라클 데이터베이스 11g 엔터프라이즈 에디션 출시 11.2.0.3.0

오라클 데이터베이스 10g 엔터프라이즈 에디션 출시 10.2.0.5.0

[Error] PLS-00331 (13: 43): PLS-00331: illegal reference to [email protected]('PARAMETERS') 

그리고 여기에 문제가 될 것으로 보인다 패키지 사양에 :

PROCEDURE SendCollection(o_data IN OUT [email protected], 
        o_seq IN OUT [email protected], 
        i_flag IN  CHAR); 

위의 내용이 정확하다고 생각하면 어떤 포인터 및 조언을 환영합니다

+1

마지막으로, 나는 이것이 가능하다고 생각하지 않습니다. 가능하다면 버전 의존성이 매우 높아서 사용중인 정확한 Oracle 버전을 지정하고 싶을 것입니다. –

+2

또한 로컬 인스턴스가 원격 유형이 수정 또는 삭제되었는지 알 수 없으므로 가능하지 않다고 생각합니다. 프로 시저를 무효화하고 사용할 때 재 컴파일 할 수 있어야합니다. [특정 제한 사항으로 나열되지 않았습니다.] (http://docs.oracle.com/cd/E18283_01/server.112/e17120/ds_concepts002.htm#i1108232). –

+0

권장 오라클 버전으로 추가되었습니다 : 오라클 (10g)은 참조 유형을 전달하고 오라클 (11g)을 통과하는 곳입니다 – Studento919

답변

2

원격 유형에 대한 참조는 허용되지 않습니다. 문서화는 이것이 불가능 함을 의미하지만 그 점에 대해서는 100 % 명확하지 않습니다.

(이 답변은 코멘트를 요약 한 것입니다 때문에 커뮤니티 위키를 사용.)

업데이트 : 원격 데이터베이스 개체 참조 (작품)

오라클은 해당 설명서의 일부와 끔찍한입니다. 때로는 정말 확실하게 시도해야합니다. 일하는 해결책 :

DECLARE 

    v_rec_sample [email protected]%ROWTYPE; 

BEGIN 

    select * 
    into v_rec_sample 
    from [email protected] 
    where rownum = 1; 

    dbms_output.put_line(v_rec_sample.crime_detail); 
    dbms_output.put_line(v_rec_sample.location); 

END; 

그것은 작동합니다. dblink 및 원격으로 정의 된 개체를 사용하여 로컬로 선언 된 변수 및 컬렉션에 대한 데이터 형식 정의를 만들 수 있습니다.

2

스레드가 아직 열려 있으므로 나중에 도움이 필요할 수있는 분은 누구나 답변 해 드리겠습니다. 당신이 객체를 전달하려는 경우 후 그 Oracle docs: Restriction on Using User-Defined Types with a Remote Database에 따라 오라클에 의해 금지되어 있습니다 :

객체 또는 특정 사용자 정의 형식을 (하는 SQL 선언 유형이 CREATE TYPE 문, 선언 유형에 반대 PL/SQL 패키지 내)은 현재 단일 데이터베이스 내에서만 유용합니다.

그러나 기록 또는 테이블 DB 링크를 통해 유형을 보낼 수 있지만에, 당신은 것입니다 : 그들에게 OID를 할당하고 같은 OID로를 만들 어느

  1. 두 데이터베이스 모두 :

    -- Obtain an OID 
    SELECT SYS_OP_GUID() FROM DUAL; 
    
    -- Result 
    SYS_OP_GUID() 
    ---------------- 
    D38A360CF86C41618DC2C40B551214C3 
    
    -- Create your type 
    create or replace type MY_TAB oid 'E8892B5D76E7419A951AEBA63A7AB3BF' as table of varchar2(50); 
    
  2. 원격 데이터베이스 : 당신이 당신의 데이터베이스에서 사용할 수 있습니다 후

    -- Create a DB link API package 
    create or replace package DBLINK_API as 
        type MY_TAB is table of varchar2(50); 
    end DBLINK_API; 
    
    -- And a function that uses that type 
    create or replace function getCount(myPar DBLINK_API.MY_TAB) return number is 
    begin 
        return myPar.count; 
    end getCount; 
    

.먼저 데이터가있는 테스트 테이블을 만듭니다.

create table TEST_TABLE 
(
    ID varchar2(50) not null 
); 

insert into TEST_TABLE values('Value 1'); 
insert into TEST_TABLE values('Value 2'); 
insert into TEST_TABLE values('Value 3'); 
insert into TEST_TABLE values('Value 4'); 
insert into TEST_TABLE values('Value 5'); 

그리고 마지막으로 원격 기능 ID의 테이블을 보낼 수있는 로컬 테이블을 사용, 즉 우리를 위해 계산을 위해 매우 유용합니다

declare 
    vals [email protected]_DBLINK; 
begin 
    select ID bulk collect 
    into vals 
    from TEST_TABLE; 

    DBMS_OUTPUT.put_line([email protected]_DBLINK(vals)); 
end; 

그것은이 예에서 잔인한처럼 보이는 대신 데이터베이스에 대한 DB 링크를 사용하여 원격 프로 시저의 TEST_TABLE에서 select를 수행하는 것이 좋습니다. 나는 성능이 어떻게 영향을 받을지 확신하지 못합니다. 아마도이 접근법은 더 큰 테이블이나 느린 선택에 더 좋을지 모르지만 같은 결과를 가져올 것입니다.

관련 문제