[  ◎ 여러 레코드 Return하기 ]     

☞ 정의
 

1. Function의 기본은 값 하나만 넘기자만

   PIPE를 이용하면 Table단위나 Row_Type단위로 값을 리턴할 수 있다.  

2. PipeLined 라고 불리는 이유는 데이터를 찾는 즉시 바로 바로 전송해주기 때문이다.  

 

   

☞ 생성 방법 1
   
- Package 안에 Type을 생성한 예제

 

-- Package 헤더 생성

CREATE OR REPLACE PACKAGE myDemoPack
       IS

       -- 레코드 타입
       
TYPE myObjectFormat IS RECORD
        ( A INT,
          B DATE,
          C VARCHAR2(25)
        );

       -- 테이블 타입
       
TYPE myTableType IS TABLE OF myObjectFormat;   

       FUNCTION prodFunc RETURN myTableType PIPELINED;  --pipelined선언

END myDemoPack;

-- Package 바디 생성

CREATE OR REPLACE PACKAGE BODY myDemoPack AS
       
FUNCTION prodFunc RETURN myTableType PIPELINED IS

       CURSOR sel_cur IS
          
SELECT ROWNUM, SYSDATE+ROWNUM, 'Row=' || ROWNUM
            
FROM DUAL
           
CONNECT BY LEVEL <= 5;

       BEGIN
           
FOR myObjectFormat IN sel_cur
              
LOOP
                  
PIPE ROW (myObjectFormat); --바로바로 리턴
              
END LOOP;

              RETURN;   --이때 RETURN는 사실 의미 없음
           
END;
        
END;

☞ 생성 방법 2
   
- Package 안에 Type을 생성한 예제
     오류 발생.. 잘 될거 같은데.. 안됨.. 오류에 원인을 알 수 없음.
 

2. 패지지 생성
   -- 패지키 헤더 생성

   
CREATE OR REPLACE PACKAGE myDemoPack
       
IS

       -- 레코드 타입
       
TYPE myObjectFormat IS RECORD
        ( A INT,
          B DATE,
          C VARCHAR2(25)
        );
 
       -- 테이블 타입
       
TYPE myTableType IS TABLE OF myObjectFormat;

       
FUNCTION prodFunc RETURN myTableType PIPELINED;  --pipelined선언

    END myDemoPack;



   --패키지 바디 생성
   
CREATE OR REPLACE PACKAGE BODY myDemoPack AS
       
FUNCTION prodFunc RETURN myTableType PIPELINED IS
       
BEGIN
           
FOR i  IN  1 .. 5   
              
LOOP
                  
PIPE ROW (myObjectFormat(i, SYSDATE+I, 'Row' || i)); --바로바로 리턴
              
END LOOP;
              
              
RETURN;   --이때 RETURN는 사실 의미 없음
           
END;
        
END

  3. 쿼리 조회
   SELECT * FROM TABLE(myDemoPack.prodFunc());
   

참고URL : http://cafe.naver.com/dbmodeler/93

Posted by 농부지기
,