首頁 >資料庫 >Oracle >如何使用C語言呼叫Oracle資料庫的預存過程

如何使用C語言呼叫Oracle資料庫的預存過程

PHPz
PHPz原創
2023-04-04 09:11:40939瀏覽

在進行軟體開發的時候,經常需要對資料庫進行操作。 Oracle資料庫的預存程序是其中一個非常重要的功能,透過預存程序我們可以將一些常用的業務邏輯封裝成一個可重複使用的程式碼庫,簡化了程式碼的開發和維護。本文將介紹如何使用C語言呼叫Oracle資料庫的預存程序。

  1. 準備工作

在開始編寫C程式之前,需要先安裝Oracle資料庫和Oracle客戶端。如果您已經安裝好了Oracle客戶端,則可以跳過這一步驟。

在安裝Oracle客戶端之前,需要先安裝好Oracle資料庫,並建立一個可供測試的資料庫使用者。在Oracle的官方網站上可以下載到Oracle用戶端,選擇與您的作業系統版本相符的版本進行安裝。

  1. 編寫C程式碼

下面是一個使用C語言呼叫Oracle預存程​​序的範例程式碼,該預存程序會查詢使用者表中指定的記錄。

#include <stdio.h>
#include <stdlib.h>
#include <oci.h>

void report_error(OCIError *errhp) {
    text msgbuf[512];
    sb4 errcode = 0;
    OCIErrorGet((dvoid *) errhp, (ub4) 1, (text *) NULL, &errcode, msgbuf, (ub4) sizeof (msgbuf), OCI_HTYPE_ERROR);
    fprintf(stderr, "Error code %d, msg: %s\n", errcode, msgbuf);
    exit(EXIT_FAILURE);
}

int main() {
    OCIEnv *envhp;
    OCIError *errhp;
    OCIServer *srvhp;
    OCISession *authp;
    OCIStmt *stmthp;
    OCIParam *paramhp;
    OCIParam *paramhp2;
    OCIParam *paramhp3;
    ub4 pos = 0;
    text *username = (text *) "YOUR_USERNAME";
    text *password = (text *) "YOUR_PASSWORD";
    text *db = (text *) "YOUR_DATABASE";
    text *proc_name = (text *) "YOUR_PROC_NAME";
    int user_id = 1;
    text *name = (text *) malloc(512 * sizeof (text));
    sb4 name_len = 0;

    OCIInitialize((ub4) OCI_DEFAULT, (dvoid *)0,  (dvoid * (*)(dvoid *, size_t))0,
                      (dvoid * (*)(dvoid *, dvoid *, size_t))0,  (void (*)(dvoid *, dvoid *))0 );

    OCIEnvInit((OCIEnv **)&envhp, OCI_DEFAULT, (size_t) 0, (dvoid **) 0);

    OCIHandleAlloc((dvoid *) envhp, (dvoid **) &errhp, OCI_HTYPE_ERROR,       (size_t) 0, (dvoid **) 0);

    OCIHandleAlloc((dvoid *) envhp, (dvoid **) &srvhp, OCI_HTYPE_SERVER,      (size_t) 0, (dvoid **) 0);

    OCIHandleAlloc((dvoid *) envhp, (dvoid **)&authp, OCI_HTYPE_SESSION,     (size_t) 0, (dvoid **) 0);

    OCIHandleAlloc((dvoid *) envhp, (dvoid **) &stmthp, OCI_HTYPE_STMT,       (size_t) 0, (dvoid **) 0);

    OCIAttrSet((dvoid *) srvhp, OCI_HTYPE_SERVER, (dvoid *) db, (ub4) strlen((char *) db), OCI_ATTR_SERVER, errhp);

    OCIServerAttach(srvhp, errhp, (text *) 0, (sb4) 0, OCI_DEFAULT);

    OCIAttrSet((dvoid *) authp, OCI_HTYPE_SESSION, (dvoid *) username, (ub4) strlen((char *) username), OCI_ATTR_USERNAME, errhp);

    OCIAttrSet((dvoid *) authp, OCI_HTYPE_SESSION, (dvoid *) password, (ub4) strlen((char *) password), OCI_ATTR_PASSWORD, errhp);

    OCISessionBegin(srvhp, errhp, authp, OCI_CRED_RDBMS, OCI_DEFAULT);

    OCIAttrSet((dvoid *) stmthp, OCI_HTYPE_STMT, (dvoid *) proc_name, (ub4) strlen((char *) proc_name), OCI_ATTR_PROCEDURE_NAME, errhp);

    OCIStmtPrepare(stmthp, errhp, (text *) "begin YOUR_PACKAGE.YOUR_PROC(:1,:2,:3); end;", (ub4) strlen("begin YOUR_PACKAGE.YOUR_PROC(:1,:2,:3); end;"), OCI_NTV_SYNTAX, OCI_DEFAULT);

    OCIParamGet(stmthp, OCI_HTYPE_STMT, errhp, (dvoid **)&paramhp, (ub4)1);

    OCIDefineByPos(stmthp, &paramhp3, errhp, 3, (dvoid *)&name, (sb4) sizeof(name), SQLT_STR, (dvoid *)&name_len, NULL, OCI_DEFAULT);

    OCIParamGet(stmthp, OCI_HTYPE_STMT, errhp, (dvoid **)&paramhp2, (ub4)2);

    OCIBindByPos(stmthp, &paramhp2, errhp, 2, (dvoid*)&user_id, (sb4)sizeof(user_id), SQLT_INT, (dvoid *)0, (ub2 *)0, (ub2 *)0, 0, (ub4 *)0, OCI_DEFAULT);

    OCIStmtExecute(authp, stmthp, errhp, (ub4) 0, (ub4) 0, (OCISnapshot *)0, (OCISnapshot *)0, OCI_DEFAULT);

    printf("user name: %s\n", name);
    
    OCIHandleFree((dvoid *) stmthp, OCI_HTYPE_STMT);
    OCIHandleFree((dvoid *) authp, OCI_HTYPE_SESSION);
    OCIHandleFree((dvoid *) srvhp, OCI_HTYPE_SERVER);
    OCIHandleFree((dvoid *) errhp, OCI_HTYPE_ERROR);
    OCIHandleFree((dvoid *) envhp, OCI_HTYPE_ENV);

    return 0;
}
  1. 運行程式碼

在編寫好C程式碼之後,我們需要編譯執行該程式碼,來測試是否可以成功呼叫預存程序。

編譯C程式碼的指令如下:

gcc -o demo demo.c -I$ORACLE_HOME/include -L$ORACLE_HOME/lib -lclntsh

其中$ORACLE_HOME為Oracle客戶端的安裝路徑。

對於Windows平台上的編譯,需要將-lclntsh改為-locci

  1. 結語

本文介紹如何使用C語言呼叫Oracle資料庫的預存程序。要注意的是,Oracle客戶端的安裝路徑需要設定好,且C程式的編譯需要連結正確的函式庫檔。在進行實際的開發工作中,還需要注意預存程序的編寫以及安全性的處理。

以上是如何使用C語言呼叫Oracle資料庫的預存過程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn