PolarDB PostgreSQL版(相容Oracle)提供了Unix版本和Windows版本的ODBC驅動,本文將介紹在不同系統中如何使用ODBC驅動。
前提條件
下載驅動
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 6 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") ;