Rumah > Artikel > pangkalan data > Bagaimana untuk memanggil prosedur tersimpan pangkalan data Oracle menggunakan bahasa C
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.
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.
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 **)¶mhp, (ub4)1); OCIDefineByPos(stmthp, ¶mhp3, errhp, 3, (dvoid *)&name, (sb4) sizeof(name), SQLT_STR, (dvoid *)&name_len, NULL, OCI_DEFAULT); OCIParamGet(stmthp, OCI_HTYPE_STMT, errhp, (dvoid **)¶mhp2, (ub4)2); OCIBindByPos(stmthp, ¶mhp2, 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; }
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
.
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!