Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk memanggil prosedur tersimpan pangkalan data Oracle menggunakan bahasa C

Bagaimana untuk memanggil prosedur tersimpan pangkalan data Oracle menggunakan bahasa C

PHPz
PHPzasal
2023-04-04 09:11:40902semak imbas

Apabila membangunkan perisian, anda selalunya perlu mengendalikan pangkalan data. Prosedur tersimpan pangkalan data Oracle adalah salah satu fungsi yang sangat penting Melalui prosedur tersimpan, kami boleh merangkum beberapa logik perniagaan biasa ke dalam perpustakaan kod yang boleh digunakan semula, memudahkan pembangunan dan penyelenggaraan kod. Artikel ini akan memperkenalkan cara menggunakan bahasa C untuk memanggil prosedur tersimpan pangkalan data Oracle.

  1. Persediaan

Sebelum anda mula menulis program C, anda perlu memasang pangkalan data Oracle dan klien Oracle. Jika anda telah memasang klien Oracle, anda boleh melangkau langkah ini.

Sebelum memasang klien Oracle, anda perlu memasang pangkalan data Oracle dan mencipta pengguna pangkalan data untuk ujian. Anda boleh memuat turun klien Oracle dari tapak web rasmi Oracle dan pilih versi yang sepadan dengan versi sistem pengendalian anda untuk pemasangan.

  1. Tulis kod C

Berikut ialah contoh kod yang menggunakan bahasa C untuk memanggil prosedur tersimpan Oracle, yang menanyakan rekod yang ditentukan dalam jadual pengguna.

#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. Jalankan kod

Selepas menulis kod C, kita perlu menyusun dan menjalankan kod untuk menguji sama ada prosedur tersimpan boleh berjaya dipanggil.

Arahan untuk menyusun kod C adalah seperti berikut:

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

di mana $ORACLE_HOME ialah laluan pemasangan pelanggan Oracle.

Untuk kompilasi pada platform Windows, anda perlu menukar -lclntsh kepada -locci.

  1. Kesimpulan

Artikel ini memperkenalkan cara menggunakan bahasa C untuk memanggil prosedur tersimpan pangkalan data Oracle. Perlu diingatkan bahawa laluan pemasangan klien Oracle perlu disediakan, dan kompilasi program C perlu dipautkan ke fail perpustakaan yang betul. Dalam kerja pembangunan sebenar, anda juga perlu memberi perhatian kepada penulisan prosedur tersimpan dan pemprosesan keselamatan.

Atas ialah kandungan terperinci Bagaimana untuk memanggil prosedur tersimpan pangkalan data Oracle menggunakan bahasa C. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn