C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[44405] Oracle의 Merge into 를 쓰면 Access violation...SQLORA8.DLL 에러 발생
새내기 [] 2461 읽음    2006-04-06 16:53
ORACLE SERVER : ORACLE ENTERPRISE 10G
CLEINT OS : WIN XP
ORACLE CLIENT : ORACLE 10G CLIENT
C++ BUILDER 6.0
BDE : 5.2 VERSION
BDE DRIVER 설정
               NATIVE   :  DLL32 : SQLORA8.DLL
                                VENDOR INIT : OCI.DLL
                                SQLPASS THRU MODE : SHARED AUTOCOMMIT

테스 예제 소스 :

void __fastcall TForm1::Button1Click(TObject *Sender)
{

        pQry->SQL->Text ="MERGE INTO RSE_STATUS RS                                              \
                          USING (SELECT :RSEID RSEID,                                           \
                     to_date(:COLLECTDATE,'yyyymmddhh24miss') COLLECTDATE,   \
                   :ANTENNACONNECT ANTENNACONNECT,                         \
                   :DBVERSION DBVERSION,                                   \
                   :FIRMWAREVERSION FIRMWAREVERSION,                       \
                   :DOORSTATUS DOORSTATUS,                                 \
                   :ANTENNAMODULESTATUS ANTENNAMODULESTATUS,               \
                   :TXPOWERVALUE TXPOWERVALUE,                             \
                   :RXSENSITIVITYVALUE RXSENSITIVITYVALUE                  \
                          FROM DUAL                                                      \
                                ) R                                                             \
                         ON (R.RSEID = RS.RSEID)                                                \
                         WHEN MATCHED THEN                                                      \
                                update                                                          \
                                set RS.COLLECTDATE = R.COLLECTDATE,                             \
                                    RS.ANTENNACONNECT = R.ANTENNACONNECT,                       \
                                    RS.DBVERSION = R.DBVERSION,                                 \
                                    RS.FIRMWAREVERSION = R.FIRMWAREVERSION,                     \
                                    RS.DOORSTATUS = R.DOORSTATUS,                               \
                                    RS.ANTENNAMODULESTATUS = R.ANTENNAMODULESTATUS,             \
                                    RS.TXPOWERVALUE = R.TXPOWERVALUE,                           \
                                    RS.RXSENSITIVITYVALUE = R.RXSENSITIVITYVALUE                \
                        WHEN NOT MATCHED THEN                                                   \
                                INSERT VALUES (R.COLLECTDATE,                                   \
                                               R.RSEID,                                         \
                   R.ANTENNACONNECT,                                \
                   R.DBVERSION,                                     \
                   R.FIRMWAREVERSION,                               \
                                               R.DOORSTATUS,                                    \
                   R.ANTENNAMODULESTATUS,                           \
                   R.TXPOWERVALUE,                                  \
                   R.RXSENSITIVITYVALUE                             \
                                              )";                                              

        /*
        pQry->ParamByName("RSEID")->AsString = "RSE0000000010";
        pQry->ParamByName("COLLECTDATE")->AsString = "20050606010100";
        pQry->ParamByName("ANTENNACONNECT")->AsString = "1";
        pQry->ParamByName("DBVERSION")->AsString = "1";
        pQry->ParamByName("FIRMWAREVERSION")->AsString = "1";
        pQry->ParamByName("DOORSTATUS")->AsString = "1";
        pQry->ParamByName("ANTENNAMODULESTATUS")->AsString = "1";
        pQry->ParamByName("TXPOWERVALUE")->AsInteger = 1;
        pQry->ParamByName("RXSENSITIVITYVALUE")->AsInteger = 1;
        */
        pQry->Params->Items[0]->AsString = "RSE0000000010";
        pQry->Params->Items[1]->AsString = "20050606010100";
        pQry->Params->Items[2]->AsString = "1";
        pQry->Params->Items[3]->AsString = "1";
        pQry->Params->Items[4]->AsString = "1";
        pQry->Params->Items[5]->AsString = "1";
        pQry->Params->Items[6]->AsString = "1";
        pQry->Params->Items[7]->AsInteger = 1;
        pQry->Params->Items[8]->AsInteger = 1;

        /*
        if(!pQry->Prepared){
                pQry->Close();
                pQry->Prepare();
                pQry->Open();
                pQry->ExecSQL();
        }
        */
        pQry->Prepare() ;
        pQry->ExecSQL();
}

실행 결과 ERROR 내용
Access violation at address 4D5F0385  in module 'SQLORA8.DLL'. Read of address 00000008. Process stopped...

merge into 구문에서만 bind 변수를 쓰면 위와 같은 에러가 발생합니다.
일반 insert, update는 이상없이 실행이 됩니다.
또는 merge into 구문에서 bind 변수를 안 쓰면 이상없이 실행이 됩니다.
일반 insert, update에서는 bind 변수를 써도 이상이 없습니다.

고수분들의 많은 도움말 부탁드리겠습니다.

+ -

관련 글 리스트
44405 Oracle의 Merge into 를 쓰면 Access violation...SQLORA8.DLL 에러 발생 새내기 2461 2006/04/06
44453     Re:Oracle의 Merge into 를 쓰면 Access violation...SQLORA8.DLL 에러 발생 박지훈.임프 2763 2006/04/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.