Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

[DocWiki 번역] 저장 프로시저 실행하기 (FireDAC)


Recommended Posts

Docwiki에 있는 "Executing Stored Procedures (FireDAC)"를 번역한 글: 번역일: 2022년 3월 29일)

위로 가기: [DocWiki 번역] 명령(command)을 가지고 작업하기 (FireDAC)

목차


1 TFDStoredProc을 사용하기 (Using TFDStoredProc)

대체로, TFDStoredProc은 디자인-타임(=개발 환경에서) 그리고/또는 런-타임(동작 중에)에 설정한다. TFDStoredProc은 TFDStoredProc 프로퍼티 값을 기반으로 저장 프로시저를 호출하는 SQL 명령(command)을 투명하게 생성한다. 저장 프로시저를 실행하기 전, FireDAC은 파라미터 값을 DBMS에게 보내고, 이어서 저장 프로시저를 실행하고, output 파라미터 값을 받는다.

주의: FireDAC은 파라미터에 기본(default) 값을 지원하지 않는다.

 

1.1 개발 환경에서 저장 프로시저 설정하기 (Setting Stored Procedures at Design Time)

저장 프로시저를 실행하려면, 폼 위에 TFDStoredProc 컴포넌트를 놓아두면 된다. 폼 위에 이미 TFDConnection이 있다면, 그것이 TFDStoredProc.Connection 프로퍼티에 자동으로 지정된다. 

그리고 나서 옵션 사항으로, CatalogName, SchemaName, PackageName 프로퍼티에 값을 지정하거나 드롭다운 목록에서 값을 선택할 수 있다. StoredProcName을 설정하고 fiMetaFetchOptions.Items에 넣으면, Params 컬렉션이 자동으로 채워진다.

파라미터 이름을 일원화하려면, ResourceOptions.UnifyParamsTrue로 지정한다. 예를 들어, 이렇게 하면, SQL 서버의 저장 프로시저 파라미터 이름에서 '@' 접두사를 제외한다.

 

1.2 실행 중에 저장 프로시저 설정하기 (Setting Stored Procedures at Runtime)

개발 화면에서 설정하는 것과 비슷하다. 아래 코드를 사용하면 된다.

FDStoredProc1.StoredProcName := 'my_proc';
FDStoredProc1.Prepare;
// Params 컬렉션이 지금 채워진다.

FetchOptions.Items 안에 fiMeta가 들어있으면, Prepare를 호출하기만 하면, Params 컬렉션이 채워진다. 이때 mkProcArgs 메타데이터가 사용된다.

주의:

  • mkProcArgs 쿼리하기는 시간이 걸릴 수 있다.
  • Params가 일단 채워지고 나면, 파라미터 정의를 애플리케이션에서 바꿀 수 없다. 예를 들어, TADParam.AsXxxx 프로퍼티를 사용하여 값을 할당하면, 암묵적으로 해당 데이터 타입이 지정된다.

위에서 설명한 이슈를 피하려면, FetchOptions.Items에서 fiMeta를 제외하면 된다. 그러면, Prepare가 호출될 때, Params 컬렉션을 자동으로 다시 구축하는 동작을 진행하지 않는다. 또한, Prepare 또는 ExecProc를 호출하기 전에 Params 컬렉션을 직접 수작업으로 채우는 방법도 있다. 각 방법 별 코드는 다음과 같다.

FDStoredProc1.StoredProcName := 'my_proc';
FDStoredProc1.FetchOptions.Items := FDStoredProc1.FetchOptions.Items - [fiMeta];
FDStoredProc1.Command.FillParams(FDStoredProc1.Params);

또는,

FDStoredProc1.StoredProcName := 'my_proc';
FDStoredProc1.FetchOptions.Items := FDStoredProc1.FetchOptions.Items - [fiMeta];
with FDStorecProc1.Params do begin
  Clear;
  with Add do begin
    Name := 'Par1';
    ParamType := ptInput;
    DataType := ftString;
    Size := 50;
  end;
  with Add do begin
    Name := 'Par2';
    ParamType := ptOutput;
    DataType := ftInteger;
  end;
end;

 

1.3 패키징된 프로시저 사용하기 (Using Packaged Procedures)

패키징된 프로시저를 사용하려면, 애플리케이션에서 패키지 이름을 명시해야 한다. 다음 중 한가지 방법을 사용한다.

  • PackageName 명시하기: [<catalog name>.][<schema name>.]<package name> 형식으로 패키지 이름을 지정한다..
  • StoredProcName 명시하기: [<catalog name>.][<schema name>.]<package name>.<stored proc name> 형식으로 저장 프로시저 이름을 지정한다.

오버로드된 프로시저을 선택하려면, 애플리케이션에서 반드시 Overload 프로퍼티를 지정해야 한다. 예를 들어 Oracle 에서는,

FDStoredProc1.PackageName := 'SYS.DBMS_SQL';
FDStoredProc1.Overload := 1;
FDStoredProc1.StoredProcName := 'BIND_VARIABLE';

 

1.4 저장 프로시저 실행하기 (Executing the Stored Procedure)

결과 세트를 반환하지 않는 저장 프로시저를 실행하려면 ExecProc 메소드를 사용한다. 저장 함수를 실행하려면  ExecProc 또는 ExecFunc 메소드를 사용한다. ExecFunc는 해당 함수의 값을 반환한다. 만약 결과 세트를 반환하는 저장 프로시저인 경우 "[FireDAC][Phys][Oracl]-310. Cannot execute command returning result sets" 예외(exception)가 발생된다.

주의: ExecProc 또는 ExecFunc 메소드에는 여러가지 오버로드 된 메소드들이 있기 때문에 TFDStoredProc의 프로퍼티를 사용하지 않고도 필요한 정보를 메소드의 인자(argument)에 명시할 수 있다. 예를 들면,

FDStoredProc1.StoredProcName := 'MY_PROC';
FDStoredProc1.Prepare;
FDStoredProc1.Params[0].Value := 100;
FDStoredProc1.Params[1].Value := 'audi';
FDStoredProc1.ExecProc;

더 간결하게 하려면,

FDStoredProc1.ExecProc('MY_PROC', [100, 'audi']);

저장 프로시저를 실행하고, 결과 세트 반환하고, 그 결과 세트 오픈(open)을 하려면, Open 메소드를 사용한다. 만약 결과 세트를 반환하지 않는 저장 프로시저인 경우 "[FireDAC][Phys][Oracl]-308. Cannot open / define command that does not return result sets" 예외(exception)가 발생한다. 만약 저장 프로시저가 결과 세트를 여러개 반환하는 경우라면, 자세한 방법은 [DocWiki 번역] 명령 묶음 (FireDAC)을 참고한다.

주의: 저장 프로시저는 비동기로 실행 할 수 있다.

 

2 TFDQuery를 사용하기 (Using TFDQuery)

TFDStoredProcTFDQuery 사이의 차이점이 있다. TFDStoredProc은 파라미터 정보를 사용하여 자동으로 저장 프로시저 호출을 생성한다.  TFDQuery에서저장 프로시저를 호출 할 때에는 명령(command)을 실행하는 FireDAC 메소드라면 무엇이든 TFDQuery의 SQL 프로퍼티에서 직접 사용할 수 있다. 예를 들어 아래와 같이 TFDQuery을 사용하여 Oracle 패키지 프로시저를 호출할 수 있다.  

with FDQuery1.SQL do begin
  Clear;
  Add('begin');
  Add('  sys.dbms_sql.bind_variable(:c, :name, :value');
  Add('end;');
end;
FDQuery1.Params[0].AsInteger := 1;
FDQuery1.Params[1].AsString := 'p1';
FDQuery1.Params[2].AsInteger := 100;
FDQuery1.ExecSQL;

 

3 TFDCommand를 사용하기 (Using TFDCommand)

마지막으로, TFDCommand를 사용하여 저장 프로시저 (stored procedure)를 실행할 수 있다. 위 사양 대부분이 TFDCommand에도 적용될 수 있다.

 

4 기타 자료 (See Also)

 

5 예제(Samples)

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.