merge into는 오라클 9i에서 추가된 기능으로 아는데... 먼저... C++빌더6는 오라클 8 버전까지만 지원합니다.
C++빌더6는 2002년 2월에 출시되었는데, 오라클 9i는 2001년 7월에 출시되었습니다. 9i가 출시되었을 때는 C++빌더6가
이미 개발 과정이었고 테스트에 필요한 시간이 모자랐죠.
게다가 SQLORA8.DLL에서 에러가 났다는 걸로 봐서는 DB 연결을 BDE로 하고 계신 거 같은데...
BDE는 C++빌더/델파이 6 버전에 번들된 BDE 5.2 버전을 마지막으로 업그레이드가 중단되고 dbExpress로 대체되었습니다.
그래서 지금 C++빌더나 델파이의 더 최신 버전을 구입하더라도 BDE는 그대로 5.2 버전이고, 따라서 오라클 8 버전까지만
지원합니다. 이건 볼랜드가 2002년에 공식적으로 발표한 내용입니다.
http://www.borlandforum.com/impboard/impboard.dll?action=read&db=news&no=93
다음 글도 참고하세요.
http://bdn.borland.com/article/0,1410,28699,00.html
그러니.. 오라클 9i 이상에서 추가된 기능을 사용하시려면 일단 BDE로는 전혀 불가능하고요.
dbExpress를 쓰거나, DOA같은 서드파티 컴포넌트를 써야 합니다.
그럼..
새내기 님이 쓰신 글 :
: 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 변수를 써도 이상이 없습니다.
:
: 고수분들의 많은 도움말 부탁드리겠습니다.