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

Recommended Posts

  • 어드민 pinned and unpinned this 토픽(기고/질문)
  • 2 years later...
  • 8 months later...
에 포스트됨

firedac + FDStoredProc 을 사용하여 온갖 방법을 시도해 oracle 저장프로시저의  sys_refcursor를 받아오려 했습니다.

코드는 다음과 같고 Connection  문제 없고 OUT_RTN_NUM, OUT_RTN_MSG 는 정상적으로 값을 받습니다.
커서만 안들어 오는데 이거 해결 부탁드립니다.

        FDStoredProc1->StoredProcName = "WEBUSERNEW.SP_PDC_RESELLER_ORD_VIEW";
        FDStoredProc1->Connection = FDConnection1;

        // FireDAC REF CURSOR 처리 방식 설정
        FDStoredProc1->FetchOptions->CursorKind = ckDefault;
        //FDStoredProc1->ResourceOptions->ArrayDMLSize = 0;
        FDStoredProc1->FetchOptions->Mode = fmAll;
        FDStoredProc1->FetchOptions->RowsetSize = 1;

        //  파라미터 설정
        FDStoredProc1->Prepare();
        FDStoredProc1->Params->ParamByName("IN_GRP_OID")->DataType = ftString;
        FDStoredProc1->Params->ParamByName("IN_GRP_OID")->ParamType = ptInput;
        FDStoredProc1->Params->ParamByName("IN_GRP_OID")->AsString = "NB370682";

        FDStoredProc1->Params->ParamByName("OUT_CURSOR")->DataType = ftCursor;
        FDStoredProc1->Params->ParamByName("OUT_CURSOR")->ParamType = ptOutput;

        FDStoredProc1->Params->ParamByName("OUT_RTN_NUM")->DataType = ftString;
        FDStoredProc1->Params->ParamByName("OUT_RTN_NUM")->ParamType = ptOutput;

        FDStoredProc1->Params->ParamByName("OUT_RTN_MSG")->DataType = ftString;
        FDStoredProc1->Params->ParamByName("OUT_RTN_MSG")->ParamType = ptOutput;

        //  저장 프로시저 실행
        FDStoredProc1->ExecProc();

        //  결과 메시지 출력
        ShowMessage("OUT_RTN_NUM: " + FDStoredProc1->ParamByName("OUT_RTN_NUM")->AsString);
        ShowMessage("OUT_RTN_MSG: " + FDStoredProc1->ParamByName("OUT_RTN_MSG")->AsString);

        //  REF CURSOR가 NULL인지 확인
        if (!FDStoredProc1->Params->FindParam("OUT_CURSOR"))
        {
            ShowMessage("Error: OUT_CURSOR 파라미터가 존재하지 않습니다.");
            return;
        }

        if (FDStoredProc1->ParamByName("OUT_CURSOR")->IsNull)
        {
            ShowMessage("Error: OUT_CURSOR가 NULL입니다.");
            return;
        }

        //  REF CURSOR 데이터를 `TDataSet *`으로 변환
        TFDDataSet* dataset = static_cast<TFDDataSet*>(FDStoredProc1->ParamByName("OUT_CURSOR")->AsDataSet);

        if (!dataset)
        {
            ShowMessage("Error: REF CURSOR 데이터가 없습니다.");
            return;
        }

        dataset->Open();

        //  결과 출력
        while (!dataset->Eof)
        {
            String record = "GRP_OID: " + dataset->FieldByName("GRP_OID")->AsString +
                            ", TICKET_NO: " + dataset->FieldByName("TICKET_NO")->AsString +
                            ", SELLER_OID: " + dataset->FieldByName("SELLER_OID")->AsString +
                            ", IS_USE_NM: " + dataset->FieldByName("IS_USE_NM")->AsString;
            ShowMessage(record);
            dataset->Next();
        }
    }
    catch (Exception &e)
    {
        ShowMessage("Stored Procedure 실행 오류: " + e.Message);
    }

이 토의에 참여하세요

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

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...

중요한 정보

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