>백엔드 개발 >C++ >C++ 및 해당 샘플 코드에서 Oracle 데이터베이스 사용

C++ 및 해당 샘플 코드에서 Oracle 데이터베이스 사용

王林
王林원래의
2023-08-22 15:57:331914검색

C++ 및 해당 샘플 코드에서 Oracle 데이터베이스 사용

Oracle은 강력한 관계형 데이터베이스 관리 시스템입니다. C++에서 Oracle 데이터베이스를 사용하면 데이터베이스를 보다 효율적으로 관리할 수 있습니다. 이 기사에서는 C++에서 Oracle 데이터베이스 및 관련 샘플 코드를 사용하는 방법을 소개합니다.

1. Oracle 데이터베이스 드라이버 설치 및 구성

Oracle 데이터베이스를 사용하기 전에 해당 Oracle 드라이버를 설치해야 합니다. Oracle은 공식 웹사이트에서 다운로드하여 설치할 수 있는 ODBC 드라이버를 공식적으로 제공합니다.

설치가 완료되면 제어판 -> 관리 도구 -> 데이터 소스(ODBC)로 이동하세요. "드라이버"에서 ODBC 드라이버를 볼 수 있습니다. 해당 드라이버를 선택하고 구성해야 합니다.

"데이터 소스 이름"에 "orcl"과 같이 연결하려는 Oracle 데이터베이스의 별칭을 입력하세요. "서버 이름"에 데이터베이스에 연결할 호스트 이름이나 IP 주소를 입력합니다. "사용자 ID"에 데이터베이스에 접속하기 위한 사용자 이름을 입력하고, 비밀번호에 해당 비밀번호를 입력하세요. "연결 테스트" 버튼을 클릭하면 "연결 성공" 메시지가 나타나면 연결이 성공한 것입니다.

2. Oracle 데이터베이스 사용

C++에서 Oracle 데이터베이스를 사용하려면 oracle 헤더 파일을 도입하고 관련 설정을 지정해야 합니다.

1. 헤더 파일 포함

먼저 oci.h 및 oci.cpp 헤더 파일을 포함해야 합니다. 이 두 헤더 파일은 Oracle 설치 디렉터리 아래의 OCI/include 디렉터리에 있습니다.

2. Oracle 라이브러리 파일 연결

oci.lib, ociw32.lib 및 orannzsbb11.dll 등을 포함한 Oracle 라이브러리 파일을 연결해야 합니다.

3. OCI 핸들 생성

OCI 핸들은 Oracle에서 제공하는 메모리 관리 메커니즘입니다. OCI 핸들은 OCILIB 라이브러리와 Oracle 서비스(SQL 문) 간의 연결 및 상호 작용을 관리하는 데 사용됩니다.

OCI 핸들을 사용할 때에는 먼저 신청한 후 필요에 따라 구성해야 합니다. 일반적으로 사용되는 OCI 핸들은 다음과 같습니다:
(1) 환경 핸들: OCIEnv.
(2) 서비스 핸들: OCISvcCtx.
(3) 세션 핸들: OCISession.
(4) 명령문 핸들: OCIStmt.
(5) 결과 세트 핸들: OCIDefine, OCIParam.

다음은 OCI 환경 핸들, 서비스 핸들, 세션 핸들, 명령문 핸들을 적용하는 코드입니다.

OCIEnv* envhp;
OCIStmt* stmthp;
OCIServer* srvhp;
OCISession* sesshp;

//申请环境句柄
int err = OCIEnvCreate(&envhp, OCI_THREADED|OCI_OBJECT, (dvoid*)0, (dvoid*(*)(dvoid*, size_t))0, (dvoid*(*)(dvoid*, dvoid*, size_t))0, (void(*)(dvoid*, dvoid*))0, (size_t)0, (dvoid**)0);

//申请服务句柄
err = OCIHandleAlloc(envhp, (dvoid**)&srvhp, OCI_HTYPE_SERVER, (size_t)0, (dvoid**)0);

//申请会话句柄
err = OCIHandleAlloc(envhp, (dvoid**)&sesshp, OCI_HTYPE_SESSION, (size_t)0, (dvoid**)0);

//申请语句句柄
err = OCIHandleAlloc(envhp, (dvoid**)&stmthp, OCI_HTYPE_STMT, (size_t)0, (dvoid**)0);

4. Oracle 데이터베이스에 연결합니다.

먼저 OCIServer의 서비스 이름을 설정한 후 OCILogon2를 호출해야 합니다. Oracle 데이터베이스에 연결하는 기능입니다. 다음은 Oracle 데이터베이스에 연결하는 코드입니다.

//设置服务名称
const char* db_name = "orcl";
err = OCIAttrSet(srvhp, OCI_HTYPE_SERVER, (dvoid*)db_name, strlen(db_name), OCI_ATTR_SERVER_NAME, envhp);

//连接数据库
const char* user_name = "scott";//连接的用户名
const char* password = "tiger";//连接的密码
const char* dblink = 0;//连接方式
ub4 dblink_len = 0;
err = OCILogon2(envhp, errhp, &sesshp, (CONST OraText*)user_name, strlen(user_name), (CONST OraText*)password, strlen(password), (CONST OraText*)dblink, (ub4)dblink_len, (CONST OraText*)0, 0);

5. SQL 문 실행

SQL 문을 실행하려면 OCIStmt 핸들과 OCIDefine 핸들을 사용해야 합니다. OCIStmt 핸들은 SQL 문을 준비하는 데 사용되고 OCIDefine 핸들은 출력 변수를 정의하는 데 사용됩니다.
다음은 SQL 문을 실행하는 코드입니다.

//定义SQL语句
const char* sql = "select empno from emp where empno=:1";
err = OCIStmtPrepare(stmthp, errhp, (CONST OraText*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);

//绑定输入参数
ub2 empno = 7900;
err = OCIBindByPos(stmthp, &bindhp, errhp, 1, &empno, sizeof(empno), SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT);

//执行SQL语句
err = OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT);

//定义输出变量
ub2 out_empno;
ub2 ind;
sb2 out_len;
ERRCALL(OCIDefineByPos(stmthp, &dfnhp, errhp, 1, (dvoid*)&out_empno, sizeof(out_empno), SQLT_INT, &ind, &out_len, 0, OCI_DEFAULT));

//获取结果
err = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT);

3. 샘플 코드

다음은 Oracle 데이터베이스에 접속하여 SQL 문을 실행하는 전체 코드입니다.

#include<iostream>
#include<occi.h>
#include<oci.h>

using namespace std;
using namespace oracle::occi;

int main()
{
    OCIEnv *envhp;
    OCIStmt *stmthp;
    OCIServer *srvhp;
    OCISession *sesshp; 

    // 申请OCI环境句柄
    int err = OCIEnvCreate(&envhp, OCI_THREADED|OCI_OBJECT, (dvoid*)0, (dvoid*(*)(dvoid*, size_t))0, (dvoid*(*)(dvoid*, dvoid*, size_t))0, (void(*)(dvoid*, dvoid*))0, (size_t)0, (dvoid**)0);

    // 申请服务句柄
    err = OCIHandleAlloc(envhp, (dvoid**)&srvhp, OCI_HTYPE_SERVER, (size_t)0, (dvoid**)0);

    // 申请会话句柄
    err = OCIHandleAlloc(envhp, (dvoid**)&sesshp, OCI_HTYPE_SESSION, (size_t)0, (dvoid**)0);

    // 申请语句句柄
    err = OCIHandleAlloc(envhp, (dvoid**)&stmthp, OCI_HTYPE_STMT, (size_t)0, (dvoid**)0);

    // 设置服务名称
    const char* db_name = "orcl";
    err = OCIAttrSet(srvhp, OCI_HTYPE_SERVER, (dvoid*)db_name, strlen(db_name), OCI_ATTR_SERVER_NAME, envhp);

    // 连接数据库
    const char* user_name = "scott";//连接的用户名
    const char* password = "tiger";//连接的密码
    const char* dblink = 0;//连接方式
    ub4 dblink_len = 0;
    err = OCILogon2(envhp, errhp, &sesshp, (CONST OraText*)user_name, strlen(user_name), (CONST OraText*)password, strlen(password), (CONST OraText*)dblink, (ub4)dblink_len, (CONST OraText*)0, 0);

    // 执行SQL语句
    const char* sql = "select empno from emp where empno=:1";
    err = OCIStmtPrepare(stmthp, errhp, (CONST OraText*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);

    ub2 empno = 7900;// 输入的empno
    OCIBind* bindhp;
    err = OCIBindByPos(stmthp, &bindhp, errhp, 1, &empno, sizeof(empno), SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT);

    OCIDefine* dfnhp;
    ub2 out_empno;
    ub2 ind;
    sb2 out_len;
    ERRCALL(OCIDefineByPos(stmthp, &dfnhp, errhp, 1, (dvoid*)&out_empno, sizeof(out_empno), SQLT_INT, &ind, &out_len, 0, OCI_DEFAULT));

    err = OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT);

    err = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
    while(err == OCI_SUCCESS)
    {
        cout << out_empno << endl;
        err = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
    }

    // 断开连接
    OCILogoff(sesshp, envhp); 
    OCIHandleFree(srvhp, OCI_HTYPE_SERVER);
    OCIHandleFree(sesshp, OCI_HTYPE_SESSION); 
    OCIHandleFree(stmthp, OCI_HTYPE_STMT); 
    OCIHandleFree(envhp, OCI_HTYPE_ENV); 

    return 0;
}

위는 Oracle 데이터베이스를 사용한 예입니다. 그리고 C++로 작성된 샘플 코드가 모든 사람에게 도움이 되기를 바랍니다.

위 내용은 C++ 및 해당 샘플 코드에서 Oracle 데이터베이스 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.