Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[8565] Re:오라클 프시져에서 cursor를 리턴받는 예제 샘플좀 알려주세요
정병선 [hanuleye] 9465 읽음    2003-01-07 22:05
오라클 테이블 타입 리턴


방법 1: 패키지 사용

==========================================================================

패키지로 커서를 선언 한 후에 패키지 바디에서 커서를 오픈 하면 됩니다.

CREATE OR REPLACE PACKAGE PK_EMP_INFO
AS
TYPE T_CUR IS REF CURSOR; --리턴받을 변수에 타입선언
PROCEDURE SP_EMP_INFO
(    P_EMP_NO IN EMP_TBL.EMP_NO%TYPE,
    P_EMP_NAME IN EMP_TBL.EMP_NAME%TYPE,
    V_CUR OUT T_CUR); --수행할 프로시져 선언
END PK_DAY_DILIGENCE_STATUS;
/
CREATE OR REPLACE PACKAGE BODY PK_EMP_INFO
AS

PROCEDURE SP_EMP_INFO
(    P_EMP_NO IN EMP_TBL.EMP_NO%TYPE,
    P_EMP_NAME IN EMP_TBL.EMP_NAME%TYPE,
    V_CUR OUT T_CUR) --수행할 프로시져 선언
   
AS
   
BEGIN
       
      IF V_CUR%ISOPEN THEN
        CLOSE V_CUR;
      END IF;
     
      OPEN V_CUR FOR
      SELECT EMP_NO, EMP_NAME
            FROM EMP_TBL
            WHERE COMPANY_CODE = P_COMPANY_CODE
            AND DIVISION_CODE LIKE P_DIVISION_CODE
            AND DEPT_CODE LIKE P_DEPT_CODE
            AND EMP_NO LIKE P_EMP_NO;

END SP_EMP_INFO;

END PK_EMP_INFO;
/

델파이에서 호출하는 부분입니다.
TStoredProc 컴포넌트의 파라미터를 세팅한 후 실행이 아니라 Open해야 됩니다.
리턴되는 Curor의 파라미터 타입은 ftCursor로 설정합니다.

procedure Form1.Button1Click(Sender: TObject);
begin
    with StoredProc1 do
    begin
      Params.Clear;
      StoredProcName:= 'PK_EMP_INFO.SP_EMP_INFO;
      Params.CreateParam(ftString, 'P_EMP_NO', ptInPut);
      Params.CreateParam(ftString, 'P_COMPANY_CODE', ptInPut);
      Params.CreateParam(ftString, 'P_DIVISION_CODE', ptInPut);
      Params.CreateParam(ftString, 'P_DEPT_CODE', ptInPut);
      Params.CreateParam(ftCursor, 'V_CUR', ptOutPut);
      Open;
    end;
end;

// 오픈전에 파라미터 값 Assign
procedure TForm1.StoredProc1BeforeOpen(DataSet: TDataSet);
begin
  with TStoredProc(DataSet) do
  begin
    ParamByName('P_COMPANY_CODE').Value:= '0';
    ParamByName('P_DIVISION_CODE').Value:= '000';
    ParamByName('P_DEPT_CODE').Value:= '0000'
    ParamByName('P_EMP_NO').Value:= Edit1.Text;
  end;
end;

위처럼 Open 하시면 스토어드프로시저를 일반 쿼리처럼 사용하실 수 있습니다.

==============================================================================

방법 2: Type Object 사용

=============================================================================

오라클의 Type과 Type Object를 생성한 후
Function에서 Return형을 생성한 Type으로 만드셔서 사용하시면 됩니다.

Type 생성
=============================================
CREATE TYPE OBJTYPEEMP_INFO
AS OBJECT EMP_NO VARCHAR2(8), EMP_NAME VARCHAR(30));

CREATE TYPE TBLTYPE_EMP_INFO
AS TABLE OF  OBJTYPE_EMP_INFO;
=============================================

Function 생성
=============================================
CREATE OR REPLACE FUNCTION GET_EMP_INFO
(      
       P_COMPANY_CODE          IN EMP_TBL.COMPANY_CODE%TYPE,
       P_DIVISION_CODE          IN EMP_TBL.DIVISION_CODE%TYPE,
       P_DEPT_CODE     IN EMP_TBL.DEPT_CODE%TYPE,
       P_PART_CODE            IN WORK_PART.PART_CODE%TYPE,
       P_EMP_NO          IN VARCHAR2  --%문자사용가능      
)

RETURN TBLTYPE_DEPT_STATUS
AS

       RESULT    TBLTYPE_EMP_INFO := TBLTYPE_EMP_INFO();

BEGIN

   DECLARE
   
    V_EMP_NO             EMP_TBL.EMP_NO%TYPE;               
    V_EMP_NAME    EMP_TBL.EMP_NAME%TYPE;
    I        NUMBER = 1;

      CURSOR SOURCE IS
        SELECT EMP_NO, EMP_NAME
        FROM_EMPLOYEE
          WHERE COMPANY_CODE = P_COMPANY_CODE
                AND DIVISION_CODE LIKE P_DIVISION_CODE
                AND DEPT_CODE LIKE P_DEPT_CODE
                AND PART_CODE LIKE P_PART_CODE
                AND EMP_NO LIKE P_EMP_NO;
                               
BEGIN


               
    OPEN SOURCE;
    LOOP
  
        FETCH SOURCE INTO V_EMP_NO, V_EMP_NAME;
      
        EXIT WHEN SOURCE%NOTFOUND;

            RESULT.EXTEND;
            RESULT(I) := OBJTYPE_EMP_INFO(V_EMP_NO, V_EMP_NAME);
            I := I + 1;      


    END LOOP;
  
   CLOSE SOURCE;
  
   RETURN RESULT; 
  
   EXCEPTION
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;  
  
END;

/* 사용방법
SELECT *
    FROM THE ( SELECT CAST(GET_EMP_INFO('1', '1', '000001', 'A', '%') as TBLTYPE_EMP_INFO )
                    FROM DUAL );
*/
======================================================

SQL 사용방법은
SELECT * FROM THE
(SELECT CAST([Function_Name]([Input 파라미터]...)
as [Type Object Name]) FROM DUAL );
쿼리 컴포넌트에 위 SQL처럼 적으시면 일반 테이블 쿼리처럼 사용하실 수 있습니다...

의문 나시는 건 다시 질문해주세요



박대곤 님이 쓰신 글 :
: 환경은 delphi5,6.  Oracle 8i 입니다.
:
: 몇가지 예제를 찾아서 실해해 보는데 정상적인 실행을 할 수 가 없네요
:
: 델파이 Source에서 프로시져(Oracle StoredProcedure)의  값을 받아보는 예제좀 만들어 주세요
:
: 아무리 찾아보고 알아봐도 잘 모르겠네요.
:

+ -

관련 글 리스트
8557 오라클 프시져에서 cursor를 리턴받는 예제 샘플좀 알려주세요 박대곤 844 2003/01/04
8565     Re:오라클 프시져에서 cursor를 리턴받는 예제 샘플좀 알려주세요 정병선 9465 2003/01/07
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.