2014-11-03 3 views
0

REF CURSOR을 반환하는 기존 저장 프로 시저를 사용해야합니다. 임시 테이블에 resultset을 삽입해야합니다. 절차의select 문에서 사용할 수 있도록 저장된 proc 테이블로 변환

사양은 다음과 같습니다

TYPE cur IS REF CURSOR; 
PROCEDURE get(p_one NUMBER ,p_two OUT cur); 

가 어떻게 테이블에이 절차의 resultset를 삽입 할 수 있습니다.

+1

이 커서가 돌아갑니다 결과 집합의 구조를 알고 계십니까? 아니면 일반적인 약한 형식의 참조 커서 'OUT' 매개 변수를 처리하려고합니까 (결과의 구조가 변경 될 수 있음)? 임시 테이블을 이미 생성 했습니까? –

+0

@JustinCave 예, 이미 임시 테이블을 만들었습니다. 그러나 일반 약형 커서도 처리 할 수 ​​있는지 알려주십시오. 고맙습니다. – user1663715

+1

강력하고 형식이 지정된 일반 참조 테이블의 데이터를 강력한 형식의 기존 임시 테이블에 저장하는 방법은 무엇입니까? 그것은 일반적으로 의미가 없기 때문에 접근 방식에 대해 열심히 제안 할 것을 제안합니다. 반환되는 커서의 구조를 알고 있고 작성한 임시 테이블의 구조와 일치하는 경우 구조적으로는 여전히 약간이지만 기술적으로는 대단히 어렵지 않습니다. –

답변

0

방금 ​​제목을 다시 읽었습니다. 실제로 프로 시저에서 선택할 수 있어야합니까?

그렇다면 파이프 라인 기능을 사용하여이를 수행 할 수 있습니다.

이에 대한 프로세스는 다음과 같습니다

  1. 당신이 필요로하는 기록 유형을 표시하는 개체 유형을 만듭니다.
  2. 개체의 중첩 테이블 형식을 만듭니다.
  3. 중첩 테이블을 반환하는 파이프 라인 함수를 만듭니다.
  4. 그런 다음이 기능에서 선택할 수 있습니다.

이 예는 당신의 방법에 당신을 얻을해야합니다

create or replace type to_test as object (
     val1 varchar2(32), 
     val2 varchar2(32) 
    ); 

    create or replace type tt_test as table of to_test; 

    create or replace function demo_pipe return tt_test pipelined  
    is 
     v_test to_test; 
    begin 
     for rec in (select * from user_tables) loop 

      v_test := to_test(rec.table_name, rec.tablespace_name); 

      pipe row (v_test); 

     end loop; 

    end; 
    /
    select * from table(demo_pipe); 
관련 문제