2012-03-01 6 views
1

두 개의 커서를 반환하는 패키지 작업 중입니다. 하나의 커서는 숫자 기본 키가있는 항목의 목록입니다. 다른 커서가 항목 지금까지Proc에서 Oracle Cursor를 사용하여이를 반환 하시겠습니까?

코드와 관련된 파일의 목록입니다 : 테이블에 누락 된 키워드 오류가

  1. :

    procedure get_items_with_files(
          o_results out sys_refcursor, 
          o_files out sys_refcursor 
    ) is 
    begin 
    
        begin 
         open o_results for 
          select item_id, 
           item_name 
          from items; 
        end; 
    
        begin 
         open o_files for 
          select item_id 
            item_file_name 
          from item_files if 
          where if.item_id in (select item_id from TABLE(CAST(o_results))); 
        end; 
    end get_items_with_files; 
    

    내가 문제로 실행하고 지역 (캐스팅 (커서)) 섹션

  2. 나는 코드에서 커서에 액세스 할 수 있습니까? 아니면 그것을 내부 변수에 복사해야합니까? sys_refcursor 유형 및 "v_cursor : = o_results 설정"변수를 만들려고했지만 누락되었거나 잘못된 옵션 오류가 있습니다.

답변

0

O_RESULTS 커서를 사용하여 O_FILES 커서를 열 수 없습니다.

당신은 두 커서를 엽니 다하기 위해 ITEMS 테이블을 조회 할 수 있지만,이 두 개의 결과 집합 당신이 O_RESULTS 커서를 열고 시간이 당신이 O_FILES 커서를 열 때 사이에 일부 데이터가 변경 동기화되지 가능성을 소개합니다 .

은 에게
procedure get_items_with_files(
      o_results out sys_refcursor, 
      o_files out sys_refcursor 
) is 
begin 

    begin 
     open o_results for 
      select item_id, 
       item_name 
      from items; 
    end; 

    begin 
     open o_files for 
      select item_id 
        item_file_name 
      from item_files if 
      where if.item_id in (select item_id from items); 
    end; 
end get_items_with_files; 

그것은 모든 절차가 커서을 여는하고있는 경우, 두 테이블을

procedure get_items_with_files(
      o_results out sys_refcursor 
) is 
begin 
    open o_results for 
     select item_id, 
      item_name, 
      item_file_name 
     from items 
      join item_files using (item_id); 
end get_items_with_files; 

결합의 결과를 나타내는 단일 커서를 반환하는 훨씬 더 일반적인 것, 그것은 것 프로 시저를 만드는 대신 뷰를 만든 다음 프로 시저를 호출하는 대신 뷰를 쿼리하는 것이 더 일반적입니다.

+0

감사합니다. 결과를 기다리면서 코드를 재분석했습니다. 내 실제 커서가 예제보다 훨씬 더 복잡한 선택하는 동안, 나는 내가 관심있는 테이블에서 필요한 필드에 중첩 된 선택을 할 수 있다는 것을 깨달았다. – SpaceCowboy74

+0

아, 첫 번째 커서의 각 항목에 대해 여러 행을 반환 할 수 없기 때문에 여러 커서에 관해서입니다. 그것은 하나 또는 하나의 요구 사항입니다. 아마도 SQLfu를 수행하여 file_name 목록을 쉼표로 구분하여 만들 수는 있지만 최종 사용자는 장기간에 두 개의 datatable 데이터 세트를 사용할 수 있습니다. (항목 당 여러 파일이 있음) – SpaceCowboy74