CentOS  Version 7.6.1810, Linux version 3.10.0-957.27.2.el7.x86_64 Install Oracle Pro*C

2019/09/28 Note :

CentOS install Oracle Pro*C and connect to Oracle remote database.

這是老派的程式人員才會用到的需求,老派的程式開發人員 Survey 能力都足夠,原則上是用不到這篇文章,

所以這篇文章主要是自己的安裝使用紀錄,免得老化的頭腦忘記怎麼做...

 

1. 檢查 CentOS 版本

cat /etc/redhat-release

 

2. 檢查 Linux 版本

cat /proc/version

 

3. 下載 Oracle 相關套件共四個

安裝方式有兩種:

zip 檔案的安裝 與 rpm 檔案的安裝;用zip檔案安裝比較繁瑣,rpm 安裝比較簡單,所以我選用 rpm 安裝方式。 

  a.Oracle Instant Client basic

   b.Oracle Instant Client sqlplus

   c. Oracle Instant Client devel

   d. Oracle Instant Client precomp

Oracle下載頁面網址:https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html

☆上面的下載是免費的,但有些套件下載時 Oracle 會要求登入會員,所以要先有 Oracle 會員。

 

完成下載後,用 root 登入 CentOS,然後建立一個 Templates 目錄,接著在 Templates 下再建立一個 oracle 目錄。

/root/Templates/oracle

目錄建立完成後,將剛剛下載的四個 Oracle 套件上傳到剛建立的目錄:

上傳四個 Oracle 套件

之後,就可以開始安裝四個套件,安裝指令很簡單:

rpm -i *rpm  rpm -i *rpm

透過上面的步驟即可完成 Oracle Pro*C 的安裝。

 

完成安裝後,要新增一個環境變數:

export LD_LIBRARY_PATH=/usr/lib/oracle/19.3/client64/lib

請將上述設定加到使用者的 .bash_profile 裡面...

export LD_LIBRARY_PATH=/usr/lib/oracle/19.3/client64/lib

 

接著就可以用 sqlplus 來連線到遠端 Oracle 資料庫,連線方式:

sqlplus 帳號/密碼@oracle_Server_位置:連接埠/資料庫名稱

sqlplus user/pwd@server_ip:port/db_name

連線成功將出現:

sqlplus 連線成功畫面

到此,Oracle Pro*C 已經完成安裝,並且能成功連線到遠端資料庫。

下面說明 Pro*C 的使用與 Compiler:

 

ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ

 

在 /usr/lib/oracle/19.3/client64/lib/precomp/admin 目錄下有兩個檔案,可以做 Pro*C compiler 的設定:

Pro*c Compiler 設定檔

pcbcfg.cfg 主要是 Compiler 時的參數設定。

pcscfg.cfg 主要是 Compiler 時的環境變數設定。

兩個檔案 cat 一下就知道怎麼用,就不多說(我也不會說...XD)。

 

Pro*C 範例:

EXEC SQL INCLUDE sqlca;
EXEC SQL INCLUDE oraca;
EXEC ORACLE OPTION (ORACA=YES);
EXEC ORACLE OPTION (RELEASE_CURSOR=YES);

void sqlerror(char *FnName, char *sqlstr)
{
    EXEC SQL WHENEVER SQLERROR CONTINUE;
    EXEC SQL ROLLBACK WORK RELEASE;

    printf ("sql error,Function Name:[%s]\n", FnName);
    printf ("SQL:\n[%s]", sqlstr);
    printf ("error\n");
    exit (0);
}

int loginDB (char *ConnectString)
{
    EXEC SQL BEGIN DECLARE SECTION;
        int db_status;
        // char db_string[101];
    EXEC SQL END DECLARE SECTION;

    // memset (db_string, 0x00, sizeof (char[101]));
    // sprintf( db_string, "scott/tiger@192.168.1.200:1521/db_name");

    EXEC SQL WHENEVER SQLERROR DO sqlerror("loginDB", NULL);
    // EXEC SQL CONNECT :db_string;
    EXEC SQL CONNECT :ConnectString;

    return(db_status);
}

int logoutDB()
{
    EXEC SQL WHENEVER SQLERROR DO sqlerror("o_logoutDB", NULL);
    EXEC SQL COMMIT WORK RELEASE;
    return(0);
}

int ReturnInteger (char *ReadSQL)
{
    EXEC SQL BEGIN DECLARE SECTION;
        int Integers;
    EXEC SQL END DECLARE SECTION;

    EXEC SQL WHENEVER SQLERROR DO sqlerror("o_ReturnInteger", ReadSQL);
    EXEC SQL PREPARE dyns1 FROM :ReadSQL;
    EXEC SQL DECLARE Curs1 CURSOR FOR dyns1;
    EXEC SQL OPEN Curs1;

    EXEC SQL WHENEVER NOT FOUND DO break;

    for ( ; ; )
    EXEC SQL FETCH Curs1 INTO : Integers;

    EXEC SQL CLOSE Curs1;
    return Integers;

在 compiler link 時,要加上 -l clntsh 這個參數才會成功。

makefile 範例:

#*------------------------------------------------------------------------*
#* Mark | Date | Name | Description *
#*------+------------+---------------+------------------------------------*
#* XXXX | xxxx/xx/xx | xxxxxxxxxxxxx | *
#*------+------------+---------------+------------------------------------*
#* XXXX | xxxx/xx/xx | xxxxxxxxxxxxx | *
#**************************************************************************

COMMONPATH = /home/user/project/
LIBPATH = $(COMMONPATH)lib/
SOURCE = $(COMMONPATH)sou/
INCPATH = $(COMMONPATH)inc/
EXEPATH = $(COMMONPATH)bin/

PC=proc

PROCLIB= -L /usr/lib/oracle/19.3/client64/lib

COMMONFG=-O3 -Wall
CCFLAG=-I $(INCPATH) -g -c
LNKFLAG=-l clntsh -o

ENS=dtread
FNS=dtread
PSQL=sql
PROC_PC=p_sql
EXES=$(EXEPATH)$(ENS)
SRCS=$(FNS).c $(PROC_PC).c
OBJS=$(FNS).o $(PROC_PC).o
PROCS=$(PROC_PC).pc

.SUFFIXES: .c .o .pc

all :: $(EXES)

$(EXES) : $(OBJS)
$(CC) $(COMMONFG) $(OBJS) $(PROCLIB) $(LNKFLAG) $(EXES)

$(OBJS) : $(SRCS)
$(CC) $(COMMONFG) $(ECPGINC) $(CCFLAG) $(SRCS)

$(SRCS) : $(PROCS)
$(PC) $(PROCS)

clean :
-rm -f $(OBJS) *.o *.log $(PROC_PC).c $(PROC_PC).lis $(EXES)

rebuild :
make clean
make

 

用 Pro*C 將 Oracle 資料讀出來,用 pgsql 將資料寫入 PostgreSQL 實作:

dttx.7z