OCI 호출 저장 프로세스

4798 단어
OCI 메모리 프로시저 호출:
std::string sql_proc = "BEGIN com_bos.getmembers(:out_result); END;";
  OCIStmt* pStmt = NULL; OCIStmt* pCur = NULL; sb2* pIndicator0 = 0; sb2* pIndicator1 = 0; sb2* pIndicator2 = 0; sb2* pIndicator3 = 0; sb2* pIndicator4 = 0; sb2* pIndicator5 = 0; sb2 pIndicator6 = -1;//이것은 지시기 변수이다. 바로 이 테이블의 이 열은 NULL 값으로 사용할 수 있다. 호출이 틀리지 않도록 이 부분에 -1을 부여한다.OCIBind* pBind = NULL; OCIDefine* pOciDefine1 = NULL; OCIDefine* pOciDefine2 = NULL; OCIDefine* pOciDefine3 = NULL; OCIDefine* pOciDefine4 = NULL; OCIDefine* pOciDefine5 = NULL; OCIDefine* pOciDefine6 = NULL; std::string strMemberNo; std::string strCompany; std::string strName; std::string strAddress; std::string strPhone; std::string strWebsite; strMemberNo.resize(10); strCompany.resize(200);     strName.resize(100); strAddress.resize(1000); strPhone.resize(100); strWebsite.resize(1000); do  { if ( CheckError(OCIHandleAlloc(m_pEnvHandle,(dvoid**)&pStmt,OCI_HTYPE_STMT,0,NULL))) { break; } if ( CheckError(OCIStmtPrepare(pStmt,m_pErrHandle,(const OraText *)sql_proc.c_str(),sql_proc.length(),OCI_NTV_SYNTAX,OCI_DEFAULT)) ) { break; } if ( CheckError(OCIHandleAlloc(m_pEnvHandle, (void **)(&pCur), OCI_HTYPE_STMT, 0, NULL)) ) { break; } if ( CheckError(OCIBindByPos(pStmt,&pBind, m_pErrHandle, 1, &pCur, 0,SQLT_RSET, pIndicator0, 0,NULL, 0,0,OCI_DEFAULT)) ) { break; } if( CheckError( OCIStmtExecute(m_pSvcHandle, pStmt, m_pErrHandle, 1, 0, NULL, NULL, OCI_COMMIT_ON_SUCCESS) ) ) { break; } //**************************************************************************** if ( CheckError(OCIDefineByPos(pCur,&pOciDefine1,m_pErrHandle,1,(void*)strMemberNo.data(),10, SQLT_STR,pIndicator1, 0, 0,OCI_DEFAULT)) ) { break; } if ( CheckError( OCIDefineByPos(pCur,&pOciDefine2, m_pErrHandle,2,(void*)strCompany.data(),200, SQLT_STR,pIndicator2, 0, 0,OCI_DEFAULT)) ) { break; } if ( CheckError(OCIDefineByPos(pCur,&pOciDefine3,m_pErrHandle,3,(void*)strName.data(),100, SQLT_STR,pIndicator3, 0, 0,OCI_DEFAULT)) ) { break; } if ( CheckError( OCIDefineByPos(pCur,&pOciDefine4, m_pErrHandle,4,(void*)strAddress.data(),1000, SQLT_STR,pIndicator4, 0, 0,OCI_DEFAULT)) ) { break; } if ( CheckError(OCIDefineByPos(pCur,&pOciDefine5,m_pErrHandle,5,(void*)strPhone.data(),100, SQLT_STR,pIndicator5, 0, 0,OCI_DEFAULT)) ) { break; } if ( CheckError( OCIDefineByPos(pCur,&pOciDefine6, m_pErrHandle,6,(void*)strWebsite.data(),1000, SQLT_STR,&pIndicator6, 0, 0,OCI_DEFAULT)) ) { break; } //************************************************************************************* int ret; while ((ret = OCIStmtFetch(pCur,m_pErrHandle, 1,OCI_FETCH_NEXT,OCI_DEFAULT)) == 0) { printf("fetched MemberNo: %s,Company: %s,Name: %s,address: %s,phone: %s,website: %s",strMemberNo.c_str(),strCompany.c_str(), strName.c_str(),strAddress.c_str(),strPhone.c_str(),strWebsite.c_str()); } printf("ret = %d",ret); } while ( false );
다음은 OCI 표시기 변수, 즉 함수 OCIDefineByPos의 여덟 번째 매개 변수에 대해 설명합니다.
이제 이런 기능을 실현해야 한다!
create table tab1(a int, b varchar(10));
insert into tab1 values(1, ''abc'');
insert into tab1 values(2, ''abcd'');
insert into tab1 values(3, null);
insert into tab1 values(4, ''abcx'');
OCI를 한 번bind로 실현합니다. 그 중 필드 값이null이기 때문에 지난번에 이 문제를 돌려서 실현했습니다. 지금은 돌릴 수 없으면 해결해야 합니다.오늘 공부 좀 했어요!(문제를 직접 해결하는 것이 좋을 것 같다. 오늘 해결하지 않아도 내일은 올 것이다)
sword OCIBindByPos ( OCIStmt      *stmtp, 
                     OCIBind      **bindpp,
                     OCIError     *errhp,
                     ub4          position,
                     dvoid        *valuep,
                     sb4          value_sz,
                     ub2          dty,
                     dvoid        *indp,
                     ub2          *alenp,
                     ub2          *rcodep,
                     ub4          maxarr_len,
                     ub4          *curelep, 
                     ub4          mode );

indp의 합리적인 사용으로 해결할 수 있습니다. 원래는 NULL을 사용했습니다.OCI 문서를 보면 알겠지만,
Input Indicator Value
Action Taken by Oracle
-1
Oracle assigns a  NULL  to the column, ignoring the value of the input variable.
>=0
Oracle assigns the value of the input variable to the column.
----------
다음은 괜찮은 OCI 문장!지시 변수라는 작은 부분을 인용했다!
표시기 변수:
Oracle에서는 열 값이 NULL일 수 있지만 C 언어에는 NULL 값이 없으므로 OCI 프로그램에서 NULL 열 값을 표현할 수 있도록 OCI 함수는 실행 중인 문장의 결합 변수에 대해 지시자 변수나 지시자 변수 배열을 연결시켜 결합된 자리 표시자가 NULL인지 또는 읽은 열 값이 NULL인지, 읽은 열 값이 잘렸는지 설명할 수 있습니다.
SQLT NTY(SQL Named DataType)를 제외한 표시자 변수 또는 표시자 변수 배열의 데이터 유형은 sb2이고 그 값은 다음과 같습니다.
입력 변수로 사용할 때: (예: insert, 업데이트 문장 중)
From: http://www.chinaunix.net/jh/19/530742.html

좋은 웹페이지 즐겨찾기