2009-07-09 8 views
4

레코드에 REF CURSOR를 반환하는 패키지에 함수가 있습니다. 코드 블록에서이 함수를 호출하려고합니다. 호출하는 코드는 다음과 같습니다레코드에서 참조 커서를 반환하는 함수에서 가져 오기

declare  
    a_record package_name.record_name; 
    cursor c_symbols is select package_name.function_name('argument') from dual; 

begin 
    open c_symbols; 
    loop    
     fetch c_symbols into a_record; 
     exit when c_symbols%notfound;    
    end loop; 
    close c_symbols; 
end; 

PACKAGE_NAME의 일부가 이런 식으로 뭔가 보이는 함수 선언 : 나는 호출 코드 블록을 실행하려고하면

TYPE record_name IS RECORD(
     field_a  varchar2(20); 
); 

TYPE record_cursor IS REF CURSOR RETURN record_name; 

FUNCTION getsymbols(argument IN varchar2) return record_cursor; 

, 나는 예외를 얻을를 : PLS- 00386 : FETCH 커서와 INTO 변수 사이의 'EXAMPLE_SYMBOLS'에 유형 불일치가 있습니다.

a_record의 유형은 무엇이며 어떻게 가져오고있는 (record_name 유형의) 레코드의 개별 요소에 액세스 할 수 있습니까?

답변

7

커서가 REFCURSOR에서 행을 가져와야한다고 생각합니다. 그렇지 않습니다. REFCURSOR 자체가 커서이므로 다른 커서를 사용하여 선택하지 마십시오.

현재 커서가 수행하는 작업은 함수 호출 결과를 포함하는 단일 열로 단일 행을 가져 오는 것입니다. record_cursor이 아니며 record_name이 아니므로 유형이 일치하지 않습니다.

나는 당신이 정말로 원하는 것은이 같은 의심 :

내 기능은 여러 레코드에 커서를 반환 어떤 경우
declare 
    symbol_cursor package_name.record_cursor; 
    symbol_record package_name.record_name; 
begin 
    symbol_cursor := package_name.function_name('argument'); 
    loop 
    fetch symbol_cursor into symbol_record; 
    exit when symbol_cursor%notfound; 

    -- Do something with each record here, e.g.: 
    dbms_output.put_line(symbol_record.field_a); 

    end loop; 

    CLOSE symbol_cursor; 

end; 
+0

? 해당 레코드를 반복 할 수있는 방법이 있습니까? – neesh

+0

위 코드가 수행하는 작업과 정확히 같습니다. 반환 된 커서에서 가져올 수있는 모든 행을 처리합니다. –

0

이 함수는 record_cursor을 반환하므로 a_recordrecord_cursor이어야합니다. 그러나 왜 ref 커서를 반환하는지 명확하지 않습니다 - 대신 함수가 record_name 유형을 반환 할 수 없습니까?

0

참조 커서를 읽는 pl/sql 블록이 나에게 이상하게 보입니다. 오라클은 커서 c_symbols의 유형을 package_name.record_cursor 유형과 일치시키지 못할 수도 있습니다.

제안 : c_symbols의 선언 "c_symbols package_name.record_cursor는"

  • 만큼 호출 된 함수 정말를 반환 않는 "c_symbols := package_name.function_name('argument')"
  • 으로 문 "open c_symbols"를 대체 할

    • 변화 커서가 작동해야합니다. 그렇지 않으면 실제 소스 코드를 게시 할 수 있습니다.

    관련 문제