歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> Oracle應用Linux開發C

Oracle應用Linux開發C

日期:2017/2/27 14:29:39   编辑:更多Linux
Linux操作系統的不斷完善與發展,出現了大量基於 Linux平台的應用開發,原有的基於UNIX平台的商業軟件也不斷被移植到Linux上來。最典型的,Oracle公司宣布,他的現有的及未來所有的數據庫產品和商業應用都將支持Linux平台。本文所述OCI for Linux的C語言庫,正是Linux平台上Oracle的C語言接口。 我們知道,在一個復雜的Oracle數據庫應用中,C程序代碼由於其語言本身的靈活性、高效性,往往被加入到其商務邏輯的核心層模塊中。Oracle數據庫對C語言的接口就是OCI(Oracle Common Interface) C-Library,該庫是一個功能十分強大的數據庫操作模塊。它支持事務處理,單事務中的多連接多數據源操作,支持數據的對象訪問、存儲過程的調用等一系列高級應用,並對Oracle下的多種附加產品提供接口。但是我們發現,為了使OCI庫在多種平台上保持統一的風格並考慮向下兼容性,Oracle對大量的C語言類型和代碼進行了重新封裝,這使得OCI庫初看上去顯得紛繁復雜,初用者不知從何下手。由Kai Poitschke開發的Libsqlora8庫初步解決了這一問題,它使得在Linux下Oracle的非高端C語言開發變得比較方便易用。 Libsqlora8 for *nix是GNU/Linux組織開發的針對Oracle8 OCI library的易用性C語言封裝。它將大量的OCI數據類型表現為通用C語言數據類型,將OCI函數按類型重新分類封裝,大大減少了函數的調用步驟和程序代碼量。Libsqlora8還有許多引人注目的特性: 易於使用的動態SQL特性; 同一連接中具有不同變量綁定的游標的重復打開; 相同事務中的多數據庫連接; Oracle數據庫應用開發中的Build-in trace功能; 正確處理數據插入操作中的數組變量問題; 多平台支持Oracle 8.0.4(HP-UX 9), Oracle 8.05(GNU/Linux), Oracle 8.1.6(GNU/Linux)等; 可以作為靜態或動態形式鏈接進入應用程序。 下面我們分步驟詳細闡述如何在Linux平台上利用Libsqlora8函數庫開發Oracle數據庫應用。 1.安裝Linux操作系統,並對新系統進行適當的系統配置。在本例中我們選用RedHat Linux 6.2操作系統。在為系統分區時,我們為Oracle數據庫專門分出兩個分區:/u01,/u02,作為Oracle數據庫的系統軟件和數據庫文件的安裝點。安裝好系統後,我們為系統增添兩個新組:oinstall和dba,並創建一個新用戶Oracle,他擁有整個數據庫系統軟件。這裡就不詳細說明了。 2.下面我們應該安裝Oracle數據庫了,這次我們選用Oracle 8.1.6版本,該版數據庫對國際化有很好的支持。在安裝數據庫之前,我們要先對Oracle用戶進行一些設置。主要是在該用戶的啟動腳本中,加入一些必要的環境變量,在本例中可以如下設置: ORACLE_BASE=/u01/app/oracle ORACLE_HOME=$ORACLE_BASE/prodUCt/8.1.6 ORACLE_SID=oratest PATH=$ORACLE_HOME/bin:/usr/bin:/etc:/bin:/usr/local/bin:/usr/X11R6/bin LD_LIBRARY_PATH=$ORACLE_HOME/lib eXPort ORACLE_BASE ORACLE_HOME ORACLE_SID PATH 3.Oracle 8.1.6的數據庫安裝是比較簡單的,我們選擇缺省安裝,在系統的提示下逐一完成安裝過程。注意,Oracle8i對系統的要求是比較高的,特別是內存,在一些特殊應用中,要修改系統的缺省設置以提高數據庫性能。有關數據庫調優的討論與本文無關,在此就不再詳細介紹了。啟動數據庫,好了,現在我們可以用sqlplus登錄數據庫,可以看到,缺省安裝的Oracle數據庫有一類OCITest數據庫表,就使用這些表作為我們例子中的缺省表。 4.安裝Libsqlora8庫函數。該庫函數當前版本為Libsqlora8-2.1.5,可從許多Linux網站上得到,也可從http://www.china-linux.org上下載libsqlora8-2.1.5.tar.gz源程序包。按以下步驟安裝: $>tar -xzvf libsqlora8-2.1.5.tar.gz $>cd libsqlora8-2.1.5 $>LD_LIBRARY_PATH=$ORACLE_HOME/lib $>export LD_LIBRARY_PATH $>./configure $>make $>make install 對於要使用Oracle build-in trace功能的開發者,還要將以下環境變量設置好,SQLORA_TRACE_LEVEL,SOLORA_TRACE_FILE,SQLORA_ARRAYSIZE,當然,ORACLE_SID是一定要設好的。 5.下面,我們介紹一下Libsqlora8的主要函數。 1)int sqlo_init(int threaded_mode) 初始化程序庫接口,讀出環境變量,設置相應的全局變量。當前,threaded_mode設為0。 2)int sqlo_connect(int * dbh, char * connect_str) 連接數據庫,dbh為數據庫連接描述符,connect_str為用戶名/口令字符串。 3)int sqlo_finish(int dbh) 斷開數據庫連接。 4)int sqlo_open(int dbh, char * stmt, int argc, char *argv[]) 打開由stmt確定的查詢語句所返回的游標。Argc,argv為查詢的參數,後面我們將用更清晰的方法傳遞參數。 5)int sqlo_close(int sth) 關閉由上一個函數打開的游標。 6)int sqlo_fetch(int sth) 從打開的游標中獲取一條記錄,並將之存入一個已分配內存空間中。 7)const char **sqlo_values(int sth, int *numbalues, int dostrip) 從內存中返回上一次sqlo_fetch取得的值,是以字符串形式返回的。 8)以下介紹另一種檢索方式,int sqlo_prepare(int dbh, char const *stmt),返回一個打開的游標sth。 9)int sqlo_bind_by_name(int sth, const char * param_name, int param_type, const void * param_addr, unsigned int param_size, short * ind_arr, int is_array) 將查詢語句的傳入參數,按照名字的形式與函數中的變量綁定。如果你使用數組,那麼參數param_addr和ind_arr必須指向該數組。 int sqlo_bind_by_pos(int sth, int param_pos, int param_type, const void * param_addr, unsigned int param_size, short * ind_arr, int is_array) 將查詢語句的傳出值,按照位置順序與函數中的變量綁定。 10)int sqlo_execute(int sth, int iterations) 執行查詢語句。“Iterations”可設為“1”。 11)在執行完數據庫操作後,我們可用int sqlo_commit (int dbh)提交操作,或用int sqlo_rollback(int dbh)回滾操作。 12)Libsqlora8還有其他一些操作函數,這裡就不一一列出了。 下面舉幾個例子說明這些函數如何使用。 cstr = "ocitest/ocitest"; //用戶名/口令 status = sqlo_init(0); if (SQLO_SUCCESS != status) { printf ("sql_init failed. Exiting\n"); exit(1); } status = sqlo_connect(&dbh, cstr); // int dbh 以上源代碼,顯示了如何連接數據庫。 /* Select all and display */ char *select_stmt="SELECT cname, clength, colid FROM ocicolu"; if (0>(sd = sqlo_open(dbh, select_stmt, 0, NULL))) { printf("sqlo_open failed: %s\n", sqlo_geterror(dbh)); return 0; } while (0 == sqlo_fetch(sd,1)) { v = sqlo_values(sd, NULL, 1); printf("Result: %s\n",v); } if (0 > sqlo_close(sd)) { printf("sqlo_open failed: %s\n", sqlo_geterror(dbh)); return 0; } 以上例子展示了第一種查詢方法,顯然,這種方法較簡單,但不夠靈活。 char *update_stmt = "UPDATE ocitest.upload_log SET upload_fresh = '0' where log_name = :1"; if (0 <= (sth = sqlo_prepare(dbh, update_stmt))) { if (SQLO_SUCCESS != (sqlo_bind_by_name(sth, ":1", SQLOT_STR, packet_name, 64, NULL, 0) )) { printf("sqlo_bind_param failed failed: %s\n", sqlo_geterror(dbh) ); return 0; } } if (SQLO_SUCCESS != sqlo_execute(sth, 1)) { printf("sqlo_execute failed: %s\n", sqlo_geterror(dbh) ); return 0; } 上面的代碼顯示了如何通過名字綁定變量,“:1”在Oracle SQL語句中表示為一個變量(名字隨意),在sqlo_bind_by_name函數中與packet_name變量綁定。在變量綁定完畢後,就可以調用sqlo_execute函數來執行這個SQL語句。




Copyright © Linux教程網 All Rights Reserved