2013-05-31

[델파이] stored procedure 사용하기

파이로 C/S 프로그램밍을 하다 보면, SQL 서버의 성능 및 보안 등 여러 유용함으로 저장 프로시저를 많이 사용하게 됩니다. 아래는 ADO의 TADOStoredProc를 통한 저장 프로시저 호출에 대한 부분을 정리하여 보았습니다. ADO가 아닌 다른 경우에도 대동소이할겁니다.

1. 호출 과정
  1. TADOStoredProc 객체를 생성(Create)합니다.
  2. 저장 프로시저를 호출하기 위한 여러 속성들, 연결(Connection) 및 저장 프로시저 이름(ProcedureName) 등을 설정합니다.
  3. 파라미터를 초기화합니다.(CreateParameter)
  4. 저장 프로시저를 실행합니다.(Open / ExecProc)
  5. 저장 프로시저가 실행된 결과를 받아서 처리합니다.(RecordCount, Eof, Fields, MoveNext 등)
  6. 사용이 끝난 객체는 닫고 소멸시킨다.


2. Open(또는 Active)과 ExecProc의 차이점
  • Open(또는 Active)
    • 저장 프로시저를 실행한 결과셋을 받습니다.
    • Active 속성이 True로 설정됩니다.
    • RecordSet 속성에 결과셋이 있습니다.
  • ExecProc
    • 저장 프로시저를 서버에서 실행만 시킵니다.
    • Active, RecordSet 속성이 변화하지 않습니다.

3. 저장 프로시저의 RETURN 값 받아 처리하기
  • 파라미터를 추가할 때, 제일 먼저 "@RETURN_VALUE" 파라미터를 추가합니다.
  • 저장 프로시저가 실행되고 난 후의 결과를 파리미터로 받아옵니다.

01.var
02.ADOStoredProc1 : TADOStoredProc;
03.begin
04.ADOStoredProc1 : TADOStoredProc.Create(nil);
05.with ADOStoredProc1 do
06.try
07.ProcedureName := 'usp_stored_proc';
08.Connection := FADOConnection;
09.Parameters.Clear;
10.Parameters.CreateParameter('RETURN_VALUE', ftInteger, pdReturnValue, 0, null);
11.Parameters.CreateParameter('@start_temp_no', ftInteger, pdInput, 0680000);
12. 
13.ExecProc;
14.ShowMessage('RETURN_VALUE = ' + IntToStr(Parameters[0].Value) + #13#10 +
15.'RecordCount = ' + IntToStr(Recordset.RecordCount));
16. 
17.// Error 발생
18.finally
19.ADOStoredProc1.Free;
20.end;
21.end;

  • 위 예제에서는 마지막 라인에서 오류가 발생합니다. 왜냐하면 ExecProc는 결과셋을 받지 않기 때문에, RecordCount 속성을 접근하려할 때 오류가 발생하게 된다.
  • 위와 같이 저장 프로시저의 파라미터를 직접 생성하여 호출할 경우에 있어서 대상 DB가 MS-SQL 서버의 경우 저장 프로시저의 파라미터를 실제 서버의 저장 프로시저 순서대로 생성(CreateParaameter)해 주어야 정상적으로 저장 프로시저가 호출이 됩니다. 그렇지 않은 경우, 전혀 엉뚱한 결과가 나오거나, 알 수 없는 오류가 발생하게 됩니다.

댓글 없음: