- oracle的pro*c簡介
- 安裝oracle用戶端
- 安裝sqlpus
- 安裝pro*c
ORACLE的PRO*C曾經很流行,雖然現在不被推崇,但是已經比較成熟項目依然使用,所以打造自己的pro*c編譯環境還是有意義的。現在網上搜一下,可能還可以找得到windows下面的pro*c編譯環境,但是linux下基本上沒有,當然你願意啃E文的話,可能還是有一些的,但是大部分都只能通過介紹oracle 9i的安裝來獲得我們需要的pro*c編譯環境,如果只是單純想安裝pro*c,那是沒有的,所以才想到寫下來記錄一下。
在linux安裝orace 9i是很麻煩的事情,首先,按照官方的說法,oracle是只支援red hat的,雖然伺服器大部分都是,但我想作為開發人員,肯定用的發行版都是五花八門了。總體而言,在ubuntu下安裝oracle9i主要存在這幾點麻煩:1.需要打補丁,而且補丁也難下;2.安裝時中文不支援;3.為了這個功能要裝這個龐然大物;4.部分動態連結程式庫很老的版本不好找;5.oracle9i的安裝光碟片實在不好拿到;6.安裝時間好長。
首先,當然是到oracle的網站下載檔案了,下面是地址 http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/linuxsoft.html。我們主要要安裝這幾個,oracle精簡用戶端,sqlplus以及pro*c。所以要分別下載這幾個檔案instantclient-basic-linux32-11.1.0.7.zip,instantclient-sqlplus-linux32-11.1.0.7.zip,instantclient-precomp-linux32-11.1.0.7.zip。
現在安裝oracle精簡用戶端及sqlplus。首先建立目錄並解壓檔案,如下:
$ cd /opt
$ sudo mkdir oracle
$ unzip instantclient-basic-linux32-11.1.0.7.zip
$ unzip instantclient-sqlplus-linux32-11.1.0.7.zip
編輯一下主目錄下.bash_profile設定幾個環境變數
export ORACLE_HOME=$ORACLE_BASE/instantclient_11_1
export LD_LIBRARY_PATH=$ORACLE_HOME:${LD_LIBRARY_PATH}
export PATH=$ORACLE_HOME:$ORACLE_HOME/sdk:$PATH
export NLS_LANG=AMERICAN_AMERICA.UTF8
將找個要用的服務名tnsnames.ora拷到相應路徑下,像我的是/opt/oracle/instantclient_11_1/network/admin,沒有目錄則建立
載入一下環境變數
$. ~/.bash_profile
還要安裝一下aio庫還要將oracle的路徑加進ld.conf
$sudo apt-get install libaio1
$sudo vi /etc/ld.so.conf.d/ora.conf
/opt/oracle/instantclient_11_1/
更新一下
$ldconfig -v
應該可以了
$sqlplus user@service_name/password
現在開始安裝pro*c了。
將instantclient-precomp-linux32-11.1.0.7.zip解壓到$ORACLE_HOME
並在該目錄下建立子目錄precomp/admin,移動pcscfg.cfg到該目錄下並編輯相應的標頭檔位置
sys_include=(/opt/oracle/instantclient_11_1/sdk/include,/usr/include,/usr/include/linux)
ltype=short
再建立子目錄lib
$sudo mkdir lib
$cd lib
$sudo ln -s libclntsh.so /opt/oracle/instantclient_11_1/libclntsh.so.11.1
寫個helloworld驗證一下我們的pro*c能不能用了。。
#include <stdio.h>
#include <stdlib.h>
EXEC SQL INCLUDE sqlca;
EXEC SQL INCLUDE oraca;
EXEC ORACLE OPTION(ORACA=YES);
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR v_username[20];
VARCHAR v_password[20];
EXEC SQL END DECLARE SECTION;
void sqlerror();
int main(){
v_username.len = sprintf(v_username.arr,"tpibs@ywdev");
v_password.len = sprintf(v_password.arr,"tppw123");
EXEC SQL WHENEVER SQLERROR DO sqlerror();
EXEC SQL CONNECT :v_username IDENTIFIED BY :v_password;
printf("\nconn ORACLE ,user:%s\n",v_username.arr);
EXEC SQL COMMIT WORK RELEASE;
return 0;
}
void sqlerror(){
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("\nORACLE error detected:\n");
printf("\n%.70s\n",sqlca.sqlerrm.sqlerrmc);
Exec sql rollback RELEASE;
}
再寫個簡單的makefile
TARGET = hello
SRCS = main.c
OBJS = main.o
COMMLIB = -lpthread -lclntsh
LINKER = $(CC)
RM = /bin/rm -f
PROC = proc
PROCFLAGS = code=ANSI_C ireclen=2048 oreclen=2048 parse=none include=/usr/include\
include=/usr/include/linux\
include=/usr/local/include\
include=/usr/lib/gcc/i486-linux-gnu/4.3.3/include
CFLAGS = -I$(ORACLE_HOME)/precomp/public\
-L$(ORACLE_HOME)/lib
.SUFFIXES: .o .c .pc
.c.o:
$(CC) -c $(CFLAGS) $<
.pc.c:
@echo "PROC ."
-$(PROC) iname=$*.pc $(PROCFLAGS)
$(TARGET): $(SRCS) $(OBJS)
$(CC) -o $@ $(OBJS) $(CFLAGS) $(COMMLIB)
clean :
$(RM) $(TARGET) $(OBJS) $(TARGET:%=%.c)
$ make
$ ./hello
conn ORACLE ,user:tpibs@ywdev