• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            拂曉·明月·彎刀

            觀望,等待只能讓出現的機會白白溜走

              C++博客 :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理 ::

            OCI(Oracle Call Inte***ce)是由頭文件和庫函數等組成的一套Oracle數據庫應用程序編程接口工具,OCI程序實質上就是用高級語言寫的程序,其特點是內部含有對OCI子函數庫的調用。
            OCI程序對開發(fā)環(huán)境的要求相對較低,只要有C語言的OCI開發(fā)工具包和C編譯器就可以,程序設計相比PRO*C復雜了點。

            1、創(chuàng)建和初始化OCI環(huán)境
            首先要在源程序中包含OCI頭文件:#include <oci.h>
            OCI環(huán)境即OCI函數的工作環(huán)境,在調用其他函數之前必須先調用OCIInitialize()和OCIEnvInit()函數創(chuàng)建和初始化OCI環(huán)境,其他OCI函數要在這個環(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為輸出參數,是一個指向OCI環(huán)境句柄的指針,OCI_DEFAULT 是OCI環(huán)境的初始化模式。OCIEnvInit()函數中的size_t類型變量為分配給用戶的內存數量,dvoid **類型變量指向用戶的內存區(qū)域,該區(qū)域的大小等于size_t類型變量。
            OCI函數中,大量使用OCI定義的數據類型和宏,其定義可參考$ORACLE_HOME/rdbms/demo目錄下的oci.h頭文件。

            2、申請句柄
            句柄是指向OCI庫所分配的內存區(qū)域的指針,該內存區(qū)域中的數據由OCI庫維護,應用程序可通過句柄訪問其中的數據。下面是應用程序中最常用的幾個句柄:
            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為新申請的句柄,m_envhp為它的父環(huán)境句柄,OCI_HTYPE_ERROR為句柄類型,表示這是一個錯誤報告句柄,OCI_HTYPE_SERVER表示服務器句柄,OCI_HTYPE_SVCCTX表示服務環(huán)境句柄,OCI_HTYPE_STMT表示語句句柄。

            存儲在句柄中的數據稱為句柄屬性,所有OCI句柄都具有屬性,可以調用OCIAttrGet()和OCIAttrSet()函數來讀取、設置句柄屬性。

            3、連接服務器建立會話
            首先調用
            OCIServerAttach(m_srvhp, m_errhp, (text *)"", strlen(""), OCI_DEFAULT);
            函數建立與指定服務器的連接,text *類型變量為空,表示連接默認數據庫服務,OCI_DEFAULT表示應用程序的操作模式為阻塞模式,在這種方式下,只有當OCI調用完成后才將控制權返回給客戶端應用程序。

            然后調用
            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));
            建立數據庫會話。此函數隱含申請服務器句柄和用戶會話句柄,登錄后,句柄是只讀的,不能再設置句柄屬性。

            4、執(zhí)行SQL語句并處理數據
            將要執(zhí)行的SQL語句copy到szSqlStr字符串中:
            snprintf( szSqlStr, sizeof(szSqlStr), "select PASSWORD from USERS where USERNAME=’chen’ ");
            執(zhí)行下列語句:

            OCIStmtPrepare(m_stmthp, m_errhp, (text*)szSqlStr, (ub4) strlen(szSqlStr), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT); //準備SQL語句

            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語句

            5、結束會話斷開數據庫連接
            OCILogoff( m_svchp, m_errhp );

            6、斷開與數據源的連接,釋放句柄
            OCIServerDetach( m_srvhp, m_errhp, OCI_DEFAULT ); //斷開與數據源的連接
            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 -o exampled –I. –I$(ORACLE_HOME)/precomp/public example.c

            (2)利用Oracle自帶的Make文件:
            首先將$ORACLE_HOME/rdbms/demo/demo_rdbms.mk文件copy到OCI源程序所在的目錄,將源文件編譯為目標文件:
            #gcc –c example.o -I$(ORACLE_HOME)/rdbms/demo -I$(ORACLE_HOME)/network/public -I$(ORACLE_HOME)/rdbms/public/ example.c
            然后用命令:#make -f demo_rdbms.mk build OBJ*=**ample.o EXE=exampled,exampled就為生成的可執(zhí)行文件

            posted on 2011-03-23 00:10 一路風塵 閱讀(1067) 評論(0)  編輯 收藏 引用 所屬分類: Oracle
            无码人妻久久一区二区三区免费| 久久99热国产这有精品| 久久精品国产影库免费看| 久久一区二区免费播放| 久久午夜电影网| 久久精品国产第一区二区三区| 精品久久久久久国产三级| 青青青伊人色综合久久| 99精品久久精品一区二区| 国产精品视频久久| 精品人妻久久久久久888| 欧美日韩精品久久免费| 亚洲精品乱码久久久久久蜜桃| 久久综合综合久久97色| 久久免费美女视频| 婷婷综合久久中文字幕蜜桃三电影| 中文字幕精品久久久久人妻| 理论片午午伦夜理片久久| 国产2021久久精品| 亚州日韩精品专区久久久| 久久精品国产亚洲av麻豆蜜芽| 久久精品一区二区三区AV| 久久婷婷成人综合色综合| 青青草国产精品久久久久| 99久久国产宗和精品1上映| 久久99热这里只频精品6| 亚洲AV无码久久精品成人 | 日本免费久久久久久久网站| 思思久久99热只有频精品66| 2021久久精品免费观看| 97久久综合精品久久久综合| 久久婷婷成人综合色综合| 久久精品这里只有精99品| 久久99热狠狠色精品一区| 日韩精品久久久久久久电影| 99久久99久久精品国产片果冻| 日韩人妻无码一区二区三区久久 | 欧美亚洲国产精品久久| 无码人妻久久一区二区三区免费 | 国产成人99久久亚洲综合精品| 久久久无码精品亚洲日韩按摩|