PolarDB PostgreSQL版(相容Oracle)提供了Unix版本和Windows版本的ODBC驅動,本文將介紹在不同系統中如何使用ODBC驅動。
前提條件
已經在PolarDB叢集建立使用者,如何建立使用者請參見建立資料庫帳號。
已經將需要訪問PolarDB叢集的主機IP地址添加到白名單,如何添加白名單請參見設定叢集白名單。
Windows系統需要為Window 7以上版本,且已經安裝了service pack 1。
Unix系統或Linux系統需要安裝以下工具:
Libtool 1.5.10及以上版本。
unixODBC-devel。
PolarTools,下載及安裝請參見PolarDB-Tools。
下載驅動
Unix或Linux系統x86架構32位驅動包:PolarDB-ODBC_Linux_X86_32.tar.gz
Unix或Linux系統x86架構64位驅動包:PolarDB-ODBC_Linux_X86_64.tar.gz
Unix或Linux系統ARM架構64位驅動包:PolarDB-ODBC_Linux_arm_64.tar.gz
Windows系統x86架構64位驅動包:PolarDB-ODBC_Windows_x86_64.7z
Windows系統x86架構32位驅動包:PolarDB-ODBC_Windows_x86_32.7z
Windows系統安裝ODBC驅動
根據Windows作業系統的位元選擇對應的安裝包,下載地址請參見下載驅動。
下載完成後,解壓ODBC包。
使用管理員身份運行
install.bat檔案,完成後按任意鍵退出即可。
可選:如果您需要卸載ODBC包,運行
uninstall.bat檔案即可完成卸載。
Windows系統使用ODBC串連PolarDB
在控制台中開啟管理工具。
在管理工具頁面,找到並運行ODBC資料來源。
在ODBC資料來源管理程式頁面,單擊添加。
選擇POLARDB(UNICODE)作為資料來源的驅動程式,單擊完成。
在彈出的對話方塊中,輸入以下資訊。
參數
說明
Date Source
資料來源名稱。
Description
資料來源的描述。
Datebase
目標資料庫名稱。
SSL Mode
選擇SSL加密方式。
Server
目標資料庫連接地址,PolarDB叢集串連地址查看方式請參見查看或申請串連地址。
Prot
目標資料庫的連接埠,預設為1521。
User Name
資料庫帳號。
Password
資料庫帳號的密碼。
單擊Save即可。
Unix或Linux系統安裝ODBC驅動
執行以下命令,設定環境變數LD_LIBRARY_PATH的路徑指向。
export LD_LIBRARY_PATH=<PolarDB-ODBC/lib/path>執行以下命令,設定環境變數ODBCINI的路徑指向。
export ODBCINI=<your odbc.init file path>根據作業系統的架構和版本下載對應的ODBC驅動,下載地址請參見下載驅動。
安裝ODBC驅動。
說明PolarDB提供的ODBC驅動壓縮包無需安裝,解壓後即可使用。解壓命令如下所示:
tar -zxvf polardb-odbc.tar.gz其目錄結果如下所示:
├── include ├── lib └── samples 3 directories
Uinx或Linux系統使用ODBC串連PolarDB
在Linux伺服器上安裝的Libtool,Libtool需要是1.5.1以上版本。
yum install -y libtool在Linux伺服器上安裝unixODBC-devel。
yum install -y unixODBC-devel編輯您配置的
odbc.ini檔案。vim $ODBCINI在
odbc.ini檔案中添加如下資訊。[POLARDB] Description = ODBC for POLARDB Driver = /home/user/target/lib/unix/polardb-odbc.so Driver64 = /home/user/target/lib/unix/polardb-odbc.so Database = <資料庫名稱> Servername = <資料庫連接地址> Password = <密碼> Port = <連接埠> Username = <使用者名稱> Trace = yes TraceFile = /tmp/odbc.log FileUsage = 1說明PolarDB叢集串連地址查看方式請參見查看或申請串連地址。
樣本中/home/user路徑需替換為
target檔案夾所在實際路徑。
串連PolarDB。
$isql -v POLARDB +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL>
Unix或Linux系統操作樣本
以下內容將為您介紹如何運行Test1和Test2測試檔案。
請提前在PolarDB資料庫中建立以下表結構並插入資料:
create table emp(empno number(4),
ename varchar2(10),
job varchar2(9),
mgr number (4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2));
insert into emp values(7369,'smith','clerk',7902 ,to_date('17-12-1980','dd-mm-yyyy'),800,null, 20 );
insert into emp values(7499,'allen','salesman',7698 ,to_date('20-2-1981','dd-mm-yyyy'),1600, 300 , 30 );
insert into emp values(7521,'ward' ,'salesman' ,7698 ,to_date(' 22-2-1981' , 'dd-mm-yyyy' ), 1250 , 500 , 30 );
insert into emp values(7566,'jones','manager' , 7839 ,to_date(' 2-4-1981' , 'dd-mm-yyyy' ), 2975 , null , 20 );
insert into emp values(7654,'martin','salesman',7698 ,to_date(' 28-9-1981' , 'dd-mm-yyyy' ), 1250 , 1400 , 30 );
insert into emp values(7698,'blake','manager', 7839 ,to_date(' 1-5-1981' , 'dd-mm-yyyy' ), 2850 , null , 30 );
insert into emp values(7782,'clark','manager', 7839 ,to_date(' 9-6-1981' , 'dd-mm-yyyy' ), 2450 , null , 10 );
insert into emp values(7788,'scott','analyst', 7566 ,to_date(' 13-7-1987' , 'dd-mm-rr ' ) - 85 , 3000 , null , 20 );
insert into emp values(7839,'king', 'president ' , null ,to_date('17-11-1981 ' , 'dd-mm-yyyy' ), 5000 , null , 10 );
insert into emp values(7844,'turner','salesman ' , 7698 ,to_date('8-9-1981 ' , 'dd-mm-yyyy' ), 1500 , 0 , 30 );
insert into emp values(7876,'adams', 'clerk' , 7788 ,to_date('13-7-1987' , 'dd-mm-rr ' ) - 51 , 1100 , null , 20 );
insert into emp values(7900,'james', 'clerk' , 7698 ,to_date('3-12-1981' , 'dd-mm-yyyy' ), 950 , null , 30 );
insert into emp values(7902,'ford', 'analyst' , 7566 ,to_date('3-12-1981' , 'dd-mm-yyyy' ), 3000 , null , 20 );
insert into emp values(7934,'miller','clerk ' , 7782 ,to_date('23-1-1982' , 'dd-mm-yyyy' ), 1300 , null , 10 );執行以下命令,解壓ODBC驅動壓縮包。
tar -zxvf polardb-odbc.tar.gz執行以下命令,開啟
polardb-odbc檔案夾。cd polardb-odbc開啟ODBC驅動檔案夾中的
samples檔案夾。cd samples對測試範例進行編譯,完成編譯後會得到
Test1和Test2兩個測試檔案。make運行
Test1和Test2。./Test1 ## 運行Test1 ./Test2 ## 運行Test2說明Test1為增刪改查樣本;Test2為遊標和out參數樣本。以下程式碼範例僅為部分代碼,完整程式碼範例請查看驅動包中的
samples檔案夾中的Test1和Test2測試檔案。
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") ;