2011-01-04 2 views
2

몇 가지 힌트가 나와 여기에 가까워 보이지만 몇 가지 독특한 문제가 있습니다.이 질문이 자신의 게시물을 올릴만큼 충분히 구별되기를 바라고 있습니다. .오라클 쓰기 절차 선택에 사용되는 항목 목록

여기에 제가 처음있는 제품이 있습니다. 표준 REF CURSOR을 반환하는 Oracle 프로 시저가 있고이 REF CURSOR이 내 응용 프로그램에 다시 전달됩니다. REF CURSOR은 조회 ID 목록입니다.

이 목록을 가져 와서 다른 데이터 저장소로 가져 와서 select 문에서 사용하고 싶습니다. REF CURSOR를 반복하여이 작업을 수행 할 수는 있지만,이를 피하기 위해 노력하고 있습니다. 나는 오히려 편지를 쓸 수있을 것이다. 또는 SELECT...WHERE EXISTS...

처음은 가능한가 아니면 덜 우아한 해결책을 시도해야 하는가? 가능하다면 어디서부터 시작해야하는지에 대한 암시가 있습니까?

저는 Oracle에 비교적 익숙하지 만 일반적으로 RDBM에서 상당히 경험이 있으므로 저의 링크를 통해 자유롭게 공부할 수 있습니다. 많이 고맙습니다

+0

ID 유형의 테이블 인 객체 유형을 작성한 다음 부속 조회의 FROM 절에 TABLE() 함수를 사용할 수 있습니다. – kurosch

+0

"다른 데이터 저장소"라고하면 별도의 실제 데이터베이스를 의미합니까? – APC

답변

1

kurosch가 "대답"으로 응답하지 않은 이유는 무엇입니까?

그래서, 참조 커서 출력의 한 행을 설명하는 SQL 유형과 이전의 테이블 인 SQL 유형을 정의하십시오. 그런 다음, 참조 커서에 의해 리턴 된 행을 리턴하는 파이프 라인 된 함수를 작성합니다. 이 함수는 표준 SQL에서 사용될 수 있습니다. 나는 이것에 Ask Tom에서 빌리고있다.

create or replace type myLookupId as object (id int) 
/

create or replace type myLookupIdTable as table of myLookupId 
/

create or replace function f return myLookupIdTable PIPELINED is 
    l_data myLookupId; 
    l_id number; 
    p_cursor SYS_REFCURSOR; 
begin 
    p_cursor := function_returning_ref_cursor(); 
    loop 
    fetch p_cursor into l_id; 
    exit when p_cursor%notfound; 
    l_data := myLookupId(l_id); 
    pipe row (l_data); 
    end loop; 
return; 
end; 
/

그리고 지금 샘플 쿼리

...
SELECT * 
FROM SOME_TABLE 
WHERE lookup_id in (SELECT ID FROM table(f)); 

코드가 정확히 잘 수없는 경우 죄송합니다

, 나는 DB 지금 테스트 할 필요가 없습니다.

+0

Ask Tom에서 이걸 보았고 그걸 가지고 놀았습니다. 나는 그것을 작동시키지 못했지만, 나는 그것이 내 자신의 실패라고 확신한다. 제가 한 가지 질문은 패키지에 해당 유형 정의를 넣을 수 있습니까? 유형을 DB 수준에서 정의해야한다는 것을 다른 곳에서 보았습니다. – Andrew

+0

맞아요, 당신은 SQL 타입을 만들 필요가 있습니다. 패키지 타입이 아닙니다. –

0

당신이 갈 수있는 몇 가지 지시 사항이 있지만 원하는 특정 솔루션에 대한 검색을 해본 결과 아무에게도 자주 나타나지 않는 것처럼 보입니다. 당신이 할 수있는 일은 오라클 메탈 링크를 검색하는 것입니다. 이것은 일반적으로 모호한 대답을 찾기에 정말로 좋습니다. 직접 PLSQL에서

을 선택을 할 수 있도록

데이터 저장소 사이의 링크를 만듭니다

다른 가능한 솔루션 - (서비스 계약을 필요로 할 수 있지만 단지 :(광산이 만료 된 것을 발견)

쿼리 문자열을 생성 할 수 있도록 Java에서 루프를 만드는 함수를 만듭니다. 좀 더 예쁘게 보일 것입니다.

그렇지 않으면 REF CURSOR가 앞뒤로 갈 필요가 있습니다. 한 연결에서 REF CURSOR의 결과를 루핑하지 않고 다른 쿼리의 쿼리에 파이프하는 방법을 알고 있어야합니다. 그것.