本文介绍如何在Unix/Linux系统中使用ODBC驱动连接PolarDB兼容Oracle数据库。

前提条件

  • 已经在PolarDB集群创建用户,如何创建用户请参见创建数据库账号
  • 已经将需要访问PolarDB集群的主机IP地址添加到白名单,如何添加白名单请参见设置集群白名单
  • 服务器操作系统为64位Linux。

下载和安装ODBC驱动

  1. 下载ODBC驱动
  2. 安装ODBC驱动。
    说明 PolarDB提供的ODBC驱动压缩包无需安装,解压后即可使用。解压命令如下所示:
    tar -zxvf polardb_oracle_odbc.tar.gz

连接PolarDB

  1. 在Linux服务器上安装的Libtool,Libtool需要是1.5.1以上版本。
    yum install -y libtool
  2. 在Linux服务器上安装unixODBC-devel。
    yum install -y unixODBC-devel
  3. 编辑/etc目录中odbcinst.ini文件。
    vim /etc/odbcinst.ini
  4. odbcinst.ini文件中添加如下信息。
    [POLARDB]
    Description = ODBC for POLARDB
    Driver      = /root/target/lib/unix/polar-odbc.so
    Setup       = /root/target/lib/unix/libodbcpolarS.so
    Driver64    = /root/target/lib/unix/polar-odbc.so
    Setup64     = /root/target/lib/unix/libodbcpolarS.so
    Database    = <数据库名称>
    Servername  = <数据库连接地址>
    Password    = <密码>
    Port        = <端口>
    Username    = <用户名>
    Trace       = yes
    TraceFile   = /tmp/odbc.log
    FileUsage   = 1
    说明
    • PolarDB集群连接地址查看方式请参见查看连接地址
    • 示例中/root路径请替换成target文件夹所在实际路径。
  5. 连接PolarDB。
    $isql -v POLARDB
    +---------------------------------------+
    | Connected!                            |
    |                                       |
    | sql-statement                         |
    | help [tablename]                      |
    | quit                                  |
    |                                       |
    +---------------------------------------+
    SQL>

示例

以下内容将为您介绍如何运行Test1Test2测试文件。

  1. 打开ODBC驱动文件夹中的samples文件夹。
    cd samples
  2. 对测试样例进行编译,完成编译后会得到Test1Test2两个测试文件。
    make
  3. 运行Test1Test2
    ./Test1
    ## 运行Test1
    
    ./Test2
    ## 运行Test2
    说明
    • Test1为增删改查示例;Test2为游标和out参数示例。
    • 以下代码示例仅为部分代码,完整代码示例请查看驱动包中的samples文件夹中的Test1Test2测试文件。

Test1示例如下所示:

... 

int main(int argc, char* argv[])
{
    /*初始化*/
    RETCODE rCode;
    HENV *hEnv = (HENV*)malloc(sizeof(HENV));
    HDBC *hDBC = (HDBC*)malloc(sizeof(HDBC));
    HSTMT *hStmt = (HSTMT*)malloc(sizeof(HSTMT));
    Connect("POLARDB","user","",&hEnv,&hDBC);
    rCode = SQLAllocStmt(*hDBC,hStmt);
    rCode = SQLAllocHandle(SQL_HANDLE_STMT,*hDBC,hStmt);
    /*增删改查*/
    ExecuteInsertStatement(&hStmt,(UCHAR*) "INSERT INTO EMP(EMPNO,ENAME) VALUES((SELECT COUNT(EMPNO) FROM EMP),'JACKSON')");
    ExecuteUpdate(&hStmt,(UCHAR*) "UPDATE EMP SET ENAME='ODBC Test' WHERE EMPNO < 100");
    ExecuteDeletStatement(&hStmt,(UCHAR*) "DELETE FROM EMP WHERE EMPNO<100");
    ExecuteSimple_Select(&hStmt,(UCHAR*) "SELECT EMPNO,ENAME,JOB,MGR,HIREDATE FROM EMP where empno = 7369");
    /*关闭连接*/
    Disconnect(&hEnv,&hDBC,&hStmt);
    /*clean up*/
    free(hEnv);
    free(hDBC);
    free(hStmt);

    return 0;
}

Test2示例如下所示:

int main(int argc, char* argv[])
{
    /* 定义*/
    RETCODE rCode;
    SQLUSMALLINT a;
    SQLINTEGER Num1IndOrLen;
    SQLSMALLINT iTotCols = 0;

    int j;
    SDWORD cbData;
    /*初始化*/
    HENV *hEnv = (HENV*)malloc(sizeof(HENV));
    HDBC *hDBC = (HDBC*)malloc(sizeof(HDBC));
    HSTMT *hStmt = (HSTMT*)malloc(sizeof(HSTMT));
    HSTMT *hStmt1 = (HSTMT*)malloc(sizeof(HSTMT));
    /*建立连接*/
    Connect("POLARDB","user","***",&hEnv,&hDBC);
    rCode = SQLAllocStmt(*hDBC,hStmt);
    rCode = SQLAllocStmt(*hDBC,hStmt1);

    rCode = SQLAllocHandle(SQL_HANDLE_STMT,*hDBC,hStmt);
    rCode = SQLAllocHandle(SQL_HANDLE_STMT,*hDBC,hStmt1);
    /*begin*/
    ExecuteSimple_Select(&hStmt1,(UCHAR*) "BEGIN;");
    /*prepare*/
    RETCODE rc = SQLPrepare((*hStmt),(SQLCHAR*)"{ call refcur_inout_callee2(?,?)}",SQL_NTS);

    rc = SQLBindParameter((*hStmt),1, SQL_PARAM_INPUT_OUTPUT, SQL_C_CHAR,SQL_REFCURSOR,0, 31,
                strName, 31, &Num1IndOrLen);
    rc = SQLBindParameter((*hStmt),2, SQL_PARAM_INPUT_OUTPUT, SQL_C_CHAR,SQL_REFCURSOR,0, 31,
                    &strName1, 31, &Num1IndOrLen);

    Num1IndOrLen=0;
    /*execute*/
    rc = SQLExecute((*hStmt));

    if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
    {
        printf("\nstrName _________ = %s\n",strName);
        printf("\nstrName 1_________ = %s\n",strName1);


    }
    printf("\n First Cursor as OUT Parameter \n")   ;