반응형

 

 

MS SQL 서버에서는 Stored Procedure 내에 그냥 SELECT 문을 써서 rowset을 클라이언트로 보낼 수 있어서
Delphi 에서 간단히 TADOStoredProc를 사용해서 파라미터만 넘겨주면 되었는데,
Oracle 에서는 이것이 되지 않아서 인터넷 에서 여러 자료를 검색하고 테스트를 해 보았지만 잘 되지 않았다.

그러다 시행착오 끝에 결국 해결방법을 찾아서 정리를 해 본다.

1. 우선 SP는 패키지를 이용해서 다음과 같은 식으로 정의 한다.

create or replace package pkgname is
     TYPE tRefCur IS REF CURSOR;
     procedure procname (
	Cust IN VARCHAR2,
	rs1 out tRefCur);
end pkgname;

create or replace package Body pkgname is
   procedure procname (
	Cust IN VARCHAR2,
	rs1 out tRefCur)
   Is
   Begin	
     open rs1 for
     SELECT
	 CustNo          
	,CustName          
	,Owner                 
	,EmpId                                     
	,TelNo            
	,BizNo        
	,vacct_no              
     FROM
	CustMst
     WHERE
	CustName like Cust || '%';

   End procname;
end pkgname;
2. TADOConnection 컴포넌트의 ConnectionString을 이용하여 Oracle 접속 문자열을 세팅 한다.

Provider=OraOLEDB.Oracle.1;Password=패스워드;Persist Security Info=True;
User ID=유저;Data Source=데이터소스;Extended Properties="plsqlrset=1"

 

3. 화면은 간단히 다음과 같이 만들었다.

   검색창에 조회조건을 넣고 Find 버튼을 누르면 SP 호출을 통해서 rowset을 가져와서 TDBGrid에 보여 준다.

 

 

4. Find 버튼에 대한 Event Procedure 에서 다음과 같이 한다.

 

procedure TForm1.btnFindClick(Sender: TObject);
begin
  with ADOStoredProc1 do begin
    Close;
    Parameters.Clear;
    Parameters.CreateParameter('Cust', ftString, pdInput, 20, null).Value := txtFind.Text;
    Open;
  end;
end;

또는 미리 TADOStoredProc의 Parameters 속성에서 INPUT 파라미터를 정의하고 다음과 같이 해도 된다.

 

 

procedure TForm1.btnFindClick(Sender: TObject);
begin
  with ADOStoredProc1 do begin
    Close;
    Parameters.ParamByName('Cust').Value := txtFind.Text;
    Open;
  end;
end;

 

이 글이 도움이 되셨으면 좋아요 눌러 주시거나 댓글을 남겨 주시면 감사 하겠습니다.

 

반응형
반응형

1. 비지니스 룰 단위의 별도 클래스 분리설계 시
TDataModule상의 TDataset과 연동문제는 어떻게 해결 해야 할지 ?
-- 즉, TDataset 및 연결된 TDataSource, TUpdateSQL등의 Event Procedure 처리가 분리된 클래스에서
처리할 수 없으므로 이벤트 처리는 여전히 TDataModule상에서 해야 하는 문제.
<방안1>
해당 비지니스 룰 클래스를 TDataModule을 상속 받게 만든다.

2. 1번의 방안1에 의해 DataModule 을 상속받은 클래스를 만들 때, 해당 Unit 내에서 또다른 클래스를 만들 때
DataModule을 상속받은 클래스가 메인 폼에서 동적으로 생성되는 클래스 라면 접근 상의 문제 발생은 어떻게 ?
또한 DataModule 상속 클래스와 다른 클래스 간의 coupling 이 존재 한다면 DataModule 상속 클래스 와
다른 클래스를 별도로 생성 및 관리를 해야 좋을지 아니면 DataModule 상속 클래스 내에서 다른 클래스를
멤버변수로 가져 가야 할지도 고민.

3. 1번과 비슷한 경우로, TDataModule 상속받은 클래스 와 TForm을 상속 받은 클래스 간에
DataSet, DataSource등의 event 발생시 TForm 상속 클래스에서 어떤 처리를 해야 할때 어떻게 해야 하는가?
(예) DataSource의 OnDataChange 이벤트 때마다 폼에서 어떤 처리를 해야 한다고 할때
어떻게 해야 uncouping 하면서도 원하는 처리를 구현 할 수 있을까?

반응형

+ Recent posts