Solaris下PROC和OCI程序設(shè)計(jì)分析與比較_第1頁(yè)
Solaris下PROC和OCI程序設(shè)計(jì)分析與比較_第2頁(yè)
Solaris下PROC和OCI程序設(shè)計(jì)分析與比較_第3頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Solaris下PROC和OCI程序設(shè)計(jì)分析與比較

摘要文章對(duì)Solaris平臺(tái)下,開發(fā)基于Oracle數(shù)據(jù)庫(kù)的C程序的兩種方法——PRO*C和OCI進(jìn)行了研究,詳細(xì)分析了這兩種方法的開發(fā)流程,給出了較為具體的應(yīng)用程序例子,并對(duì)兩者的性能進(jìn)行了比較。關(guān)鍵詞Solaris,Oracle,PRO*C,OCI1引言數(shù)據(jù)庫(kù)在軟件開發(fā)中的應(yīng)用越來(lái)越廣泛,其中,Oracle可說(shuō)是性能最強(qiáng)大、最穩(wěn)定的數(shù)據(jù)庫(kù)之一,大量的軟件開發(fā)選擇了Oracle。在開發(fā)語(yǔ)言的選擇上,C語(yǔ)言以其靈活、高效吸引了大批的軟件開發(fā)人員。這兩者的強(qiáng)強(qiáng)聯(lián)合也必具有較高的性能,在實(shí)際中有廣泛的應(yīng)用。這就是PRO*C和OCI程序設(shè)計(jì)。Oracle常常應(yīng)用在服務(wù)器中,Solaris又是服務(wù)器的首選平臺(tái),因此,本文主要介紹PRO*C和OCI程序設(shè)計(jì)在Solaris平臺(tái)上的應(yīng)用和實(shí)現(xiàn),對(duì)在Windows平臺(tái)和Linux平臺(tái)上的應(yīng)用和實(shí)現(xiàn)也可作為參考。本文所采用的開發(fā)環(huán)境為Solaris2.8、Oracle8.1.7。2PRO*C程序設(shè)計(jì)PRO*C是Oracle提供的應(yīng)用程序?qū)S瞄_發(fā)工具,它以C語(yǔ)言為宿主語(yǔ)言,能在C程序中嵌入SQL語(yǔ)句,進(jìn)行數(shù)據(jù)庫(kù)操作。這種嵌入式的SQL語(yǔ)句容易掌握,適合初學(xué)者。2.1設(shè)置開發(fā)環(huán)境(1)C編譯器Solaris系統(tǒng)中常用的C語(yǔ)言編譯器是GCC,是GNU組織的免費(fèi)C編譯器,一般Linux版本中缺省都安裝有GCC,UNIX系統(tǒng)中有的并不自帶,因此需要手動(dòng)安裝,本文所采用的GCC版本為3.2。(2)PRO*C預(yù)編譯器PRO*C使用預(yù)編譯技術(shù),預(yù)編譯器將源程序中的SQL語(yǔ)句轉(zhuǎn)換為標(biāo)準(zhǔn)的Oracle庫(kù)函數(shù)調(diào)用,從而生成C源程序,再經(jīng)C編譯器編譯、鏈接后生成可執(zhí)行文件。這個(gè)預(yù)編譯器是Oracle自帶的。(3)C語(yǔ)言頭文件和函數(shù)庫(kù)。Oracle安裝程序?qū)⑦@些文件安裝在$ORACLE_HOME/precomp目錄下。2.2開發(fā)PRO*C程序(1)說(shuō)明SQL通訊區(qū)SQL通訊區(qū)用來(lái)記錄執(zhí)行每一個(gè)嵌入SQL語(yǔ)句的狀態(tài)信息,通過在函數(shù)體外使用下列語(yǔ)句實(shí)現(xiàn):#include<sqlca.h>或者EXECSQLINCLUDEsqlca;(2)聲明宿主變量,即C變量這些變量是應(yīng)用程序與Oracle通信的橋梁,應(yīng)用程序的輸入數(shù)據(jù)通過C變量傳遞給Oracle,反之,Oracle的輸出數(shù)據(jù)又通過C變量傳遞給應(yīng)用程序。舉例如下:EXECSQLBEGINDECLARESECTION;charszUsername[16];VARCHARvarPassword[16];char*szStmt1="CREATETABLEUSERS(USERNAMEVARCHAR2(15)NOTNULL,PASSWORDVARCHAR2(15)NOTNULL)";char*szStmt2="SELECTPASSWORDFROMUSERSWHEREUSERNAME='chen'";EXECSQLENDDECLARESECTION;值得注意的是:在SQL語(yǔ)句中使用C變量時(shí),前面需加冒號(hào),例如上面的變量應(yīng)表示為:szUsername。其中,VARCHAR為C擴(kuò)展數(shù)據(jù)類型,預(yù)編譯時(shí),PRO*C預(yù)編譯器將它擴(kuò)展為一個(gè)C結(jié)構(gòu)類型struct{unsignedshortlen;unsignedchararr[16];}varNo;在SQL語(yǔ)句中使用VARCHAR類型變量時(shí),只需指出結(jié)構(gòu)名稱varPassword就可,但在C語(yǔ)句中使用VARCHAR類型變量時(shí),必須具體說(shuō)明所操作變量的結(jié)構(gòu)元素名稱是varPassword.len還是varPassword.arr。另外,如果用VARCHAR類型變量做函數(shù)參數(shù)的話,只能用指針形式。(3)連接數(shù)據(jù)庫(kù)EXECSQLCONNECT:username/password@DBname;通過sqlca.sqlcode的值來(lái)判斷連接數(shù)據(jù)庫(kù)成是否功。(4)執(zhí)行SQL語(yǔ)句(分為靜態(tài)SQL語(yǔ)句和動(dòng)態(tài)SQL語(yǔ)句)靜態(tài)SQL語(yǔ)句是在開發(fā)應(yīng)用程序時(shí)就已經(jīng)明確了的數(shù)據(jù)庫(kù)操作,如:EXECSQLSELECTpasswordINTO:szPasswordFROMUSERSWHEREusername=:szUsername;動(dòng)態(tài)SQL語(yǔ)句是在運(yùn)行時(shí)由外部數(shù)據(jù)提供的,不能直接在C程序中嵌入SQL語(yǔ)句,但可以調(diào)用放在一個(gè)字符串變量里的SQL語(yǔ)句,最簡(jiǎn)單的方法是:EXECSQLEXECUTEIMMEDIATE:szStmt1;但這樣執(zhí)行的SQL語(yǔ)句不能實(shí)現(xiàn)查詢,實(shí)現(xiàn)查詢可用下列方法:EXECSQLPREPAREselect_stmtFROM:szStmt2;EXECSQLEXECUTEselect_stmtINTO:szPassword;如果不再需要已準(zhǔn)備好的語(yǔ)句,應(yīng)釋放:EXECSQLDEALLOCATEPREPAREselect_stmt;(5)提交或回滾所做的數(shù)據(jù)庫(kù)處理,并退出數(shù)據(jù)庫(kù)回滾:EXECSQLROLLBACKWORKRELEASE;提交:EXECSQLCOMMITWORKRELEASE;注意語(yǔ)句中的RELEASE選項(xiàng),它要求關(guān)閉所有打開的游標(biāo),之后斷開與數(shù)據(jù)庫(kù)服務(wù)器的連接。2.3生成可執(zhí)行文件在Solaris平臺(tái)下可通過命令方式對(duì)PRO*C源程序進(jìn)行預(yù)編譯,下列命令只列出了最常用的預(yù)編譯選項(xiàng):#prociname=example.cINCLUDE=pathCODE=ANSI_CMODE=ANSICPP_SUFFIX=ccSQLCHECK=SEMANTICSUSERID=username/password@DBname預(yù)編譯后的example.cc文件就可以當(dāng)作普通的C源文件來(lái)進(jìn)行處理了。#gcc-oexampled–I.-I/oracle/product/8.1.7/precomp/publicexample.cc最終生成的exampled文件就是我們的可執(zhí)行文件。3OCI程序設(shè)計(jì)OCI(OracleCallInterface)是由頭文件和庫(kù)函數(shù)等組成的一套Oracle數(shù)據(jù)庫(kù)應(yīng)用程序編程接口工具,OCI程序?qū)嵸|(zhì)上就是用高級(jí)語(yǔ)言寫的程序,其特點(diǎn)是內(nèi)部含有對(duì)OCI子函數(shù)庫(kù)的調(diào)用。OCI程序?qū)﹂_發(fā)環(huán)境的要求相對(duì)較低,只要有C語(yǔ)言的OCI開發(fā)工具包和C編譯器就可以,程序設(shè)計(jì)相比PRO*C復(fù)雜了點(diǎn)。3.1創(chuàng)建和初始化OCI環(huán)境首先要在源程序中包含OCI頭文件:#include<oci.h>OCI環(huán)境即OCI函數(shù)的工作環(huán)境,在調(diào)用其他函數(shù)之前必須先調(diào)用OCIInitialize()和OCIEnvInit()函數(shù)創(chuàng)建和初始化OCI環(huán)境,其他OCI函數(shù)要在這個(gè)環(huán)境中才能執(zhí)行。先定義變量:OCIEnv**m_envhp;

OCIError*m_errhp;

OCIServer*m_srvhp;

OCISvcCtx*m_svchp;

OCIStmt*m_stmthp;OCIInitialize((ub4)OCI_DEFAULT,(dvoid*)0,(dvoid*(*)(dvoid*,size_t))0,

(dvoid*(*)(dvoid*,dvoid*,size_t))0,(void(*)(dvoid*,dvoid*))0);OCIEnvInit((OCIEnv**)&m_envhp,OCI_DEFAULT,(size_t)0,(dvoid**)0);其中m_envhp為輸出參數(shù),是一個(gè)指向OCI環(huán)境句柄的指針,OCI_DEFAULT是OCI環(huán)境的初始化模式。OCIEnvInit()函數(shù)中的size_t類型變量為分配給用戶的內(nèi)存數(shù)量,dvoid**類型變量指向用戶的內(nèi)存區(qū)域,該區(qū)域的大小等于size_t類型變量。OCI函數(shù)中,大量使用OCI定義的數(shù)據(jù)類型和宏,其定義可參考$ORACLE_HOME/rdbms/demo目錄下的oci.h頭文件。3.2申請(qǐng)句柄句柄是指向OCI庫(kù)所分配的內(nèi)存區(qū)域的指針,該內(nèi)存區(qū)域中的數(shù)據(jù)由OCI庫(kù)維護(hù),應(yīng)用程序可通過句柄訪問其中的數(shù)據(jù)。下面是應(yīng)用程序中最常用的幾個(gè)句柄:

OCIHandleAlloc((dvoid*)m_envhp,(dvoid**)&m_errhp,OCI_HTYPE_ERROR,(size_t)0,(dvoid**)0);OCIHandleAlloc((dvoid*)m_envhp,(dvoid**)&m_srvhp,OCI_HTYPE_SERVER,

(size_t)0,(dvoid**)0);OCIHandleAlloc((dvoid*)m_envhp,(dvoid**)&m_svchp,OCI_HTYPE_SVCCTX,

(size_t)0,(dvoid**)0);OCIHandleAlloc((dvoid*)m_envhp,(dvoid**)&m_stmthp,OCI_HTYPE_STMT,

(size_t)0,(dvoid**)0);其中m_errhp為新申請(qǐng)的句柄,m_envhp為它的父環(huán)境句柄,OCI_HTYPE_ERROR為句柄類型,表示這是一個(gè)錯(cuò)誤報(bào)告句柄,OCI_HTYPE_SERVER表示服務(wù)器句柄,OCI_HTYPE_SVCCTX表示服務(wù)環(huán)境句柄,OCI_HTYPE_STMT表示語(yǔ)句句柄。存儲(chǔ)在句柄中的數(shù)據(jù)稱為句柄屬性,所有OCI句柄都具有屬性,可以調(diào)用OCIAttrGet()和OCIAttrSet()函數(shù)來(lái)讀取、設(shè)置句柄屬性。3.3連接服務(wù)器建立會(huì)話首先調(diào)用OCIServerAttach(m_srvhp,m_errhp,(text*)"",strlen(""),OCI_DEFAULT);函數(shù)建立與指定服務(wù)器的連接,text*類型變量為空,表示連接默認(rèn)數(shù)據(jù)庫(kù)服務(wù),OCI_DEFAULT表示應(yīng)用程序的操作模式為阻塞模式,在這種方式下,只有當(dāng)OCI調(diào)用完成后才將控制權(quán)返回給客戶端應(yīng)用程序。然后調(diào)用OCILogon(m_envhp,m_errhp,&m_svchp,(text*)m_szUser,strlen(m_szUser),(text*)m_szPassword,strlen(m_szPassword),(text*)m_szDbName,strlen(m_szDbName));建立數(shù)據(jù)庫(kù)會(huì)話。此函數(shù)隱含申請(qǐng)服務(wù)器句柄和用戶會(huì)話句柄,登錄后,句柄是只讀的,不能再設(shè)置句柄屬性。3.4執(zhí)行SQL語(yǔ)句并處理數(shù)據(jù)將要執(zhí)行的SQL語(yǔ)句copy到szSqlStr字符串中,snprintf(szSqlStr,sizeof(szSqlStr),"selectPASSWORDfromUSERSwhereUSERNAME=’chen’");執(zhí)行下列語(yǔ)句:OCIStmtPrepare(m_stmthp,m_errhp,(text*)szSqlStr,(ub4)strlen(szSqlStr),(ub4)OCI_NTV_SYNTAX,(ub4)OCI_DEFAULT);

//準(zhǔn)備SQL語(yǔ)句OCIDefine*defnp0=(OCIDefine*)0;

//定義輸出變量OCIDefineByPos(m_stmthp,&defnp0,m_errhp,1,(dvoid*)szUSERNAME,100,SQLT_STR,(dvoid*)0,(ub2*)0,(ub2*)0,OCI_DEFAULT);

//綁定變量OCIStmtExecute(m_svchp,m_stmthp,m_errhp,(ub4)1,(ub4)0,(OCISnapshot*)NULL,(OCISnapshot*)NULL,(ub4)OCI_DEFAULT);

//執(zhí)行SQL語(yǔ)句3.5結(jié)束會(huì)話斷開數(shù)據(jù)庫(kù)連接

OCILogoff(m_svchp,m_errhp);3.6斷開與數(shù)據(jù)源的連接,釋放句柄OCIServerDetach(m_srvhp,m_errhp,OCI_DEFAULT);

//斷開與數(shù)據(jù)源的連接OCIHandleFree((dvoid*)m_stmthp,OCI_HTYPE_STMT);

//釋放句柄OCIHandleFree((dvoid*)m_svchp,OCI_HTYPE_SVCCTX);OCIHandleFree((dvoid*)m_srvhp,OCI_HTYPE_SERVER);OCIHandleFree((dvoid*)m_errhp,OCI_HTYPE_ERROR)3.7生成可執(zhí)行文件(兩種方法)(1)同普通的C程序:#gcc-oexampled–I.–I$(ORACLE_HOME)/precomp/publicexample.c(2)利用Oracle自帶的Make文件:首先將$ORACLE_HOME/rdbms/demo/demo_rdbms.mk文件copy到OCI源程序所在的目錄,將源文件編譯為目標(biāo)文件:#gcc–cexample.o-I$(ORACLE_HOM

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論