2017-09-05 5 views
0

GET_CLIENT_IN_SED (return sys_refcursor) 함수가 있습니다.이 함수는 ID 번호 목록 (단일 열)을 제공합니다. 이제, 절차, 그 각각의 값 (하나씩)을 통해 루프를 시도하고있다 그리고 두 번째 절차를 (그것이 클라이언트 ID 매개 변수를 필요로) 호출을 위해 사용합니다. 의 Ref 커서를 통해 반복하려면Oracle PL/SQL 커서 (함수에서)의 각 값을 하나씩 다른 커서에 할당하십시오.

PROCEDURE GET_ORDINARY_CLIENT; 

PROCEDURE GET_ORDINARY_CLIENT_BY_SED 
    (sed_in IN varchar2, client_sed OUT SYS_REFCURSOR) 
IS 
    ordinary_clients sys_refcursor; 

BEGIN 
    ordinary_clients := GET_CLIENT_IN_SED(sed_in); 
    for item in ordinary_clients loop 
    client_sed := client_sed + ordinary_clients(i); 
    end loop; 
END; 

답변

1

를 지금까지 내가 당신이 할 필요가 이해할 수 뭔가 같은 :

기능 :

이 함수는 숫자를 입력 받아 refcursor를 반환합니다. 귀하의 요구 사항과 유사합니다. (귀하의 경우 절차에서)

CREATE OR REPLACE FUNCTION get_num_sysrefcur (num IN NUMBER) 
    RETURN SYS_REFCURSOR 
AS 
    my_cursor SYS_REFCURSOR; 
BEGIN 
    -- 
    OPEN my_cursor FOR 
     WITH ntable 
      AS (SELECT 1 ID, 111 AGT, 'ABC' DESCRIP FROM DUAL 
       UNION ALL 
       SELECT 2 ID, 222 AGT, 'ABC' DESCRIP FROM DUAL 
       UNION ALL 
       SELECT 1 ID, 333 AGT, 'ABC' DESCRIP FROM DUAL) 

     SELECT AGT FROM ntable WHERE ID = num; 


    RETURN my_cursor; 
END; 
/

블록 은 - 기록을 통해이 익명 블록의 의지 루프는 SYS_REFCURSOR에서 돌아갑니다. 당신은 당신이 두 번째 절차는 SYS_REFCURSOR 및 루프를의 값을 사용하려는 필요에 비슷한 (이 익명 블록 대신에 프로 시저를 만들 수 있습니다.)

+0

벌크 (bulk) 수집은 내가 사용하기를 좋아하는 또 다른 유효한 접근법입니다 (나는 커서를 사용하는 것보다 컬렉션을 다루는 것이 훨씬 더 간단하다는 것을 알았습니다!). 데이터의 양이 매우 큰 경우에 더 사용되지 않지만 대신 반복자의 변수에 저장하기 때문이다. 당신은 대량을 사용하여 반복 할 수 @Dessma – Dessma

+0

뿐만 아니라 수집합니다. 한 번에 데이터 선택을 제한하는 제한 조항이 있으며 모든 레코드를 반복 할 수 있습니다. – XING

1

은 FOR ... LOOP가 작동하지 않는 이유를 설명 배열이나 테이블을 통해 루프처럼되지 않습니다. 대신 컬렉션의 짧은에서

은의 ref_cursor는 "포인터"또는 콜렉션의 "반복자"에 가깝습니다. 이 다른 질문에서는 FETCH를 사용하여 ref_cursor을 통해 반복의 아주 좋은 예를 찾을 수 있습니다.

How to use record to loop a ref cursor?

당신의 데이터가있는 예는 다음과 같습니다

PROCEDURE GET_ORDINARY_CLIENT_BY_SED(sed_in  IN VARCHAR2, 
            client_sed OUT SYS_REFCURSOR) IS 
    ordinary_clients SYS_REFCURSOR; 
    clt    NUMBER; -- assuming your cursor contains strictly numbers 
BEGIN 
    ordinary_clients := GET_CLIENT_IN_SED(sed_in); 
    LOOP 
     FETCH ordinary_clients 
     INTO clt; 
     EXIT WHEN ordinary_clients%NOTFOUND; 
     dbms_output.put_line(clt); 
     -- do some other things here with your number 
    END LOOP; 
END; 
+0

테이블에서로드하려고하지 않고 sys_refcursor 반환 함수에서로드하려고합니다. 값을 얻는 방법에 대한 지침 만 테이블에 저장되어 있기 때문입니다. 그래서 나는 can not use table_name % ROWTYPE – miMescua

+0

미안 당신의'ordinary_client' 커서가 테이블 행과 같은 "복잡한"유형을 포함한다고 가정했습니다. refcursor에 숫자와 같은 간단한 데이터 만있는 경우 적절한 유형의 간단한 변수로 FETCH하고 ​​동일한 논리로 사용할 수 있습니다. 나는 추가 정보로 나의 대답을 편집 할 것이다. – Dessma