본문 바로가기
프로그래밍/delphi

odac oracle procedure cursor(커서)로 결과 조회 (delphi7 )

by 메르세데쓰 2022. 8. 22.
반응형

안녕하세요! 델파이 개발자님들...

 

우리나라엔 델파이(delphi) 개발자분들이 많지 않습니다. 한글로 된 검색이 잘 안 나오다 보니 어려운 부분이 미만저만이 아닙니다. 정보공유의 차원에서 포트팅을 하려 합니다.

 

odac (devart Oracle Data Access Component) 컴포넌트를 이용하여 다이렉트로 오라클 프로시저(oracle-procedure)에서 커서(cursor-return) 결과를 가져오는 방법입니다.

 

장점이 매우 많은 강력한 컴포넌트 입니다. 거기다 성능도 막강하죠.. 

 

사용한 버전은 12.1.1 for D7입니다. 

devart-odac 12.1.1

 

핵심만 간단하게.. 매우 간단한 조회용 프로시저를 해보려 합니다. 

 

1. 컴포넌트만 사용하는 방식과

 

2. 코딩으로만 하는 방식  

 

두 가지를 진행하겠습니다. 

 

 

첫 번째 컴포넌트만 사용하는 방법입니다.

 

폼에 TOraSession, TOraStoredProc를 올려놓습니다.

 

OraSession의 ConnectString에 db접속 정보를 한꺼번에 입력합니다. 아래와 같은 형태로 입력하면 매우 편리하죠..

 

계정명/패스워드@서버ip:포트번호/서비스명

 

ex)  scott/tiger@192.168.0.200:1521/TEST

 

odac - TOraSession, TOraStoredProc

그리고..  

 

OraStoredProc의

그리고 Session을 클릭하여 연결합니다. OraSession 

 

쓰이게 될 프로시저입니다. 간단한 샘플입니다.

PROCEDURE        PC_RSLT_CCCODEST ( 
                 IN_GBN               IN  VARCHAR2              
                ,IN_USE_YN            IN  VARCHAR2               
                ,O_RSLT               OUT NOCOPY SYS_REFCURSOR  --  저장에 대한 결과 
                  )
AUTHID CURRENT_USER  AS  

BEGIN

     if IN_GBN = 'MRI_ORDR' then    
		           OPEN O_RSLT FOR
						select ''          CDGBN
						      ,a.ordcd     CCD
						      ,''          CDNM
						      ,''          ETC
						      ,''          CDNM2
						      ,''          CDNM3
						      ,''          CDNM4
                          from testdb a;
     end if;
END PC_RSLT_CCCODEST;

O_RSLT라는 CURSOR(커서)에 결과를 담아오게 됩니다.

 

다시 델파이로 돌아와서... OraStoredProc를

 

odac - TOraStoredProc

하단에 Execute -> Data Editor를 눌러주면.. 값이 잘 받아오는 걸 확인할 수 있습니다!

 

 

추가로.. dbGrid에 연결을 하려면...

 

DataSource , DBGrid를 폼에 추가로 올리고.. DataSet에 OraStoredProc , DataSource에 DataSource를 각각 연결하면 됩니다. 

OraDataSource, TDBGrid

그리고 OraStoredProc를 Active 하면 결과가 들어오는 걸 확인할 수 있습니다. 

odac - DBGrid Link

복잡해 보일 수 있지만 실제 해보면 매우 간단합니다.

 

두 번째.. 코딩으로만 하는 방식입니다.

 

제가 제일 선호하는 방식이기도 하죠..!  

 

클릭하는 버튼과... 표시할 그리드를 올려 봅니다.

 

button and grid

 

예상하시겠지만.. 버튼을 클릭했을 때 위에 나왔던 데이터가 조회되는 것입니다.

 

procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
    OraSession1 : TOraSession;
    OraStoredProc1 : TOraStoredProc;
begin

    OraSession1 := TOraSession.Create(nil);
    OraStoredProc1 := TOraStoredProc.Create(nil);

    try
          OraSession1.ConnectString := 'scott/tiger@192.168.0.200:1521/TEST';
          OraStoredProc1.Session    := OraSession1;
          OraStoredProc1.FetchAll   := true;
          OraStoredProc1.StoredProcName := 'PC_RSLT_CCCODEST';
          OraStoredProc1.PrepareSQL;
          OraStoredProc1.ParamByName('IN_GBN').AsString := 'MRI_ORDR';
          OraStoredProc1.Execute;

          if OraStoredProc1.RecordCount > 0 then
          begin
             AdvStringGrid1.RowCount := OraStoredProc1.RecordCount+1;
             i := 0;
             while not OraStoredProc1.Eof do
             begin
                   AdvStringGrid1.Cells[0,i+1] := OraStoredProc1.FieldByName('CDGBN'  ).AsString;
                   AdvStringGrid1.Cells[1,i+1] := OraStoredProc1.FieldByName('CCD'    ).AsString;
                   AdvStringGrid1.Cells[2,i+1] := OraStoredProc1.FieldByName('CDNM'   ).AsString;
                   AdvStringGrid1.Cells[3,i+1] := OraStoredProc1.FieldByName('ETC'    ).AsString;
                   AdvStringGrid1.Cells[4,i+1] := OraStoredProc1.FieldByName('CDNM2'  ).AsString;
                   AdvStringGrid1.Cells[4,i+1] := OraStoredProc1.FieldByName('CDNM3'  ).AsString;
                   AdvStringGrid1.Cells[4,i+1] := OraStoredProc1.FieldByName('CDNM4'  ).AsString;
                   OraStoredProc1.Next;
                   inc(i);
             end;
          end;

    finally
          OraStoredProc1.Disconnected := true;
          OraStoredProc1.Free;
          OraSession1.Free;
    end;
end;

끝입니다. 흠.. 별거 없죠? Cursor(커서) 리턴을 받는 기본 형태입니다.

FetchAll 속성을 변경하지 않으면.. 한 번에 25개씩 값을 받아오게 되어 코딩으로 처리하지 않으면 그리드의 RowCount는 25+1 이 됩니다. 참고해주세요..

 

button 을 눌렀을 때 grid 결과가 나왔음

 

예상하시겠지만 별문제 없이 원하는 데이터를 화면에 표시하였습니다.  코딩이  더 쉽죠! 서버 ip가 변경되거나 여러 가지 돌발적인 상황에 대응하기가 쉽습니다.

 

눈치채셨겠지만.. 파라미터의 갯수가 늘어나더라도 이름으로 찾아 값을 대입하는 형태로 코딩을 하면 운영 중인 프로시저에 Parameter를 추가하더라도 오류가 발생하지 않습니다. 뭐 물론 특수한 형태의 것은 좀 문제가 될 소지가 있지만 일반적인 String형태는 상관이 없습니다.

 

감사합니다!

반응형

댓글