안녕하세요! 델파이 개발자님들...
우리나라엔 델파이(delphi) 개발자분들이 많지 않습니다. 한글로 된 검색이 잘 안 나오다 보니 어려운 부분이 미만저만이 아닙니다. 정보공유의 차원에서 포트팅을 하려 합니다.
odac (devart Oracle Data Access Component) 컴포넌트를 이용하여 다이렉트로 오라클 프로시저(oracle-procedure)에서 커서(cursor-return) 결과를 가져오는 방법입니다.
장점이 매우 많은 강력한 컴포넌트 입니다. 거기다 성능도 막강하죠..
사용한 버전은 12.1.1 for D7입니다.
핵심만 간단하게.. 매우 간단한 조회용 프로시저를 해보려 합니다.
1. 컴포넌트만 사용하는 방식과
2. 코딩으로만 하는 방식
두 가지를 진행하겠습니다.
첫 번째 컴포넌트만 사용하는 방법입니다.
폼에 TOraSession, TOraStoredProc를 올려놓습니다.
OraSession의 ConnectString에 db접속 정보를 한꺼번에 입력합니다. 아래와 같은 형태로 입력하면 매우 편리하죠..
계정명/패스워드@서버ip:포트번호/서비스명
ex) scott/tiger@192.168.0.200:1521/TEST
그리고..
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를
하단에 Execute -> Data Editor를 눌러주면.. 값이 잘 받아오는 걸 확인할 수 있습니다!
추가로.. dbGrid에 연결을 하려면...
DataSource , DBGrid를 폼에 추가로 올리고.. DataSet에 OraStoredProc , DataSource에 DataSource를 각각 연결하면 됩니다.
그리고 OraStoredProc를 Active 하면 결과가 들어오는 걸 확인할 수 있습니다.
복잡해 보일 수 있지만 실제 해보면 매우 간단합니다.
두 번째.. 코딩으로만 하는 방식입니다.
제가 제일 선호하는 방식이기도 하죠..!
클릭하는 버튼과... 표시할 그리드를 올려 봅니다.
예상하시겠지만.. 버튼을 클릭했을 때 위에 나왔던 데이터가 조회되는 것입니다.
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 이 됩니다. 참고해주세요..
예상하시겠지만 별문제 없이 원하는 데이터를 화면에 표시하였습니다. 코딩이 더 쉽죠! 서버 ip가 변경되거나 여러 가지 돌발적인 상황에 대응하기가 쉽습니다.
눈치채셨겠지만.. 파라미터의 갯수가 늘어나더라도 이름으로 찾아 값을 대입하는 형태로 코딩을 하면 운영 중인 프로시저에 Parameter를 추가하더라도 오류가 발생하지 않습니다. 뭐 물론 특수한 형태의 것은 좀 문제가 될 소지가 있지만 일반적인 String형태는 상관이 없습니다.
감사합니다!
'프로그래밍 > delphi' 카테고리의 다른 글
odac, Object-type변수를 이용한 데이터 저장(oracle, procedure, delphi) (1) | 2022.08.25 |
---|---|
odac, Table-type변수를 이용한 데이터 저장(oracle, procedure, delphi) (1) | 2022.08.24 |
stored Procedure 연결하기 Oracle Data Access Component delphi (0) | 2019.10.16 |
DELPHI 폼생성에서 종료까지~ (0) | 2017.09.23 |
DELPHI 컴포넌트 생성시 매개변수의 의미? (0) | 2017.09.22 |
댓글