2015-02-04 4 views
0

여러 SELECT 문으로 CAPTURED_DATA_01 테이블에 삽입하려고합니다. EVENT_ID, ENV_ID, BRAND_ID, BP_ID 값을 삽입 할 수 있지만 이제는 SUBSCRIPTION_ID 값은 원격 테이블에있는 select 문을 사용하여 얻을 것이다. 쿼리를 테스트하고 SUBSCRIPTION_ID 점점 얻으려면 제대로 실행됩니다. 하지만 난 후 나는 여기있다ORA-22992 원격 테이블 문제에서 LOB에 대한 참조를 제거합니다.

SQL Error: ORA-22992: cannot use LOB locators selected from remote tables 
22992. 00000 - "cannot use LOB locators selected from remote tables" 
*Cause: A remote LOB column cannot be referenced. 
*Action: Remove references to LOBs in remote tables 

로 내 하위 쿼리 내부의 SUBSCRIPTION_ID 캐스트 기능을 사용 한 오류를 얻고 내 삽입 쿼리 내부에 SUBSCRIPTION_ID의 값을 삽입하기 위해이 선택 문을 사용하려고 할 때 내 쿼리 :

Insert into CAPTURED_DATA_01(SUBSCRIPTION_ID) 
select WF.SUBSCRIPTION_ID 
    from 
    (select WF.SUBSCRIPTION_ID from [email protected]_RETAIL WF,CAPTURED_DATA_01 CP 
where WF.SUBSCRIPTION_ID > CP.SUBSCRIPTION_ID and 
WF.SUBSCRIPTION_ID IN 
( 
select iw.SUBSCRIPTION_ID 
from (
    SELECT TO_NUMBER(REPLACE(REPLACE(REGEXP_SUBSTR(RESPONSE_XML, '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>\d+</ax2130:id>'), 
    '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>', ''), '</ax2130:id>', '')) 
    AS SUBSCRIPTION_ID , 
    CAST(REPLACE(REPLACE(
    REGEXP_SUBSTR(REQUEST_XML, '<ns7:orderType>.+</ns7:orderType>'), 
    '<ns7:orderType>', ''), '</ns7:orderType>', '') 
    AS VARCHAR(100)) AS order_type, 
    TO_NUMBER(REPLACE(REPLACE(REGEXP_SUBSTR(RESPONSE_XML, '<ax2147:orderNumber>\d+</ax2147:orderNumber> '), 
    '<ax2147:orderNumber>', ''), '</ax2147:orderNumber> ', '')) 
    AS ORDER_NUMBER, 
    CREATE_DATE 
    FROM 
    [email protected]_RETAIL 
    where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder' 
) iw 
where iw.order_type='SELF_REGISTRATION' 
)and WF.NAME='INITIATE_MANDATE' 
and WF.STATUS_ID=0) 
+0

단지 작은 문제가이 문 TO_NUMBER에 있습니다 (REPLACE ((REGEXP_SUBSTR (RESPONSE_XML, REPLACE '<: 구독 XSI : 유형 = ax2147 "ax2127 : SubscriptionDTO">을 \ D +') 내가 오류를 얻고 여기서 (이 오류를 검색 할 수있는 문서가 없습니다.) '', '),' ',)')) AS SUBSCRIPTION_ID – Andrew

+0

문제는 삽입이 항상 로컬에서 처리되므로 LOB 열에서 substr 등을 원격 선택으로 수행하지 않는다는 것입니다. drive_site 힌트를 사용하여 동작을 변경할 수 있지만 힌트는 내가 아는 한 삽입을 위해 무시됩니다. PL/S에서 커서를 쿼리해야 할 수도 있습니다 QL 블록과 (벌크) 인서트. –

+0

ohh ok 나는 PL/SQL 환경이 좋지 않지만이 경우 커서를 사용해보십시오. 이 선택 쿼리에 대한 커서 예제가 있습니까? – Andrew

답변

1

지금까지 내가 그것을 이해, 문제는 insert 항상 로컬 데이터베이스에서 실행되는 것입니다.

select을 실행하면 오라클 데이터베이스에서 일부 작업을 수행 할 것인지 결정할 수 있습니다 (또는 암시 할 수 있음). 이 경우에는 CLOB 값을 number 및 varchar2 유형으로 변환하므로 추가 처리를 위해 비 LOB 값만 네트워크를 통해 로컬 데이터베이스로 전송해야합니다.

삽입의 경우 전체 LOB를 검색하여 로컬로 변환하려고 시도하며, 발생하는 데이터의 잠재적 양 때문에 아마도이를 중지합니다. driving_site 힌트는 삽입에 대해 무시되므로 선택할 수있는 것처럼 해당 동작을 조정할 수 없습니다.

PL/SQL 블록의 커서를 사용하여 선택 및 삽입을 두 단계로 수행 할 수 있습니다. 일반적인 패턴은 다음과 같습니다 대량 약

declare 
    type cp_tab_type is table of CAPTURED_DATA_01%ROWTYPE; 
    cp_tab cp_tab_type; 
    cur sys_refcursor; 
begin 
    open cur for 
    select ... -- some value for every column in the table you're inserting 
       -- into, in the same order they appear in the DDL 
    loop 
    fetch cur bulk collect into cp_tab; 
    exit when cp_tab.count = 0; 
    forall i in 1..cp_tab.count 
     insert into CAPTURED_DATA_01 values cp_tab(i); 
    end loop; 
end; 
/

Read more 수집하고 FORALL 배치 쿼리/삽입 할 수 있습니다.

on 절에 사용할 수있는 것이 있으면 merge을 사용할 수도 있습니다.

merge into CAPTURED_DATA_01 cp 
using (
    select .. 
) data 
on (cp.event_id = data.event_id) 
when not matched then 
insert (EVENT_ID,SUBSCRIPTION_ID,EVENT_TIMESTAMP,ENV_ID,BRAND_ID,BP_ID) 
values (data.event_id, data.subscription_id, data.start_date, 
    data.env_id, data.brand_id, data.bp_id); 

조회에 당신이 게시 각 질문에 더 복잡해진다 아마 꽤 간단하게 할 수있다 : exmaple에 대한 event-id 전혀 아직 존재하지 않을 경우.

+0

안녕하세요, 알렉스가 당신의 힌트에 감사드립니다. Merge로 생각한 것은 원격으로 삽입하는 것이 가능한가?또는 나는 정상적인 삽입과 같은 문제에 직면하게 될 것인가? 그래서 completetd 대량 삽입 커서를 사용하여 작업하는 대신 병합 시도 할 수 있습니까? – Andrew

+0

다른 열을 제거하여 질문을 편집했습니다. 그리고 다른 열을 제외하고 SUBSCRIPTION_ID를 삽입하여 병합을 시도해보고 싶습니다.이 경우 병합 문이 내 질문과 같이 어떻게 생겼는지 알 수 있습니까? – Andrew

+0

하나의 열만 사용하려면 insert 및 values ​​절을 변경하십시오. 원격 삽입물은 어디에서 왔습니까? 요구 사항, 제한 사항 및 기존 코드를 계속 변경하면 매우 실망 스럽습니다. 행운을 빕니다. –