Heim >Datenbank >Oracle >So rufen Sie die gespeicherte Prozedur der Oracle-Datenbank mit der Sprache C auf

So rufen Sie die gespeicherte Prozedur der Oracle-Datenbank mit der Sprache C auf

PHPz
PHPzOriginal
2023-04-04 09:11:40939Durchsuche

Bei der Entwicklung von Software müssen Sie häufig die Datenbank betreiben. Die gespeicherten Prozeduren der Oracle-Datenbank sind eine der sehr wichtigen Funktionen. Durch gespeicherte Prozeduren können wir einige gängige Geschäftslogiken in einer wiederverwendbaren Codebibliothek kapseln und so die Entwicklung und Wartung des Codes vereinfachen. In diesem Artikel wird erläutert, wie Sie mithilfe der C-Sprache die gespeicherte Prozedur der Oracle-Datenbank aufrufen.

  1. Vorbereitung

Bevor Sie mit dem Schreiben von C-Programmen beginnen, müssen Sie die Oracle-Datenbank und den Oracle-Client installieren. Wenn Sie den Oracle-Client bereits installiert haben, können Sie diesen Schritt überspringen.

Bevor Sie den Oracle-Client installieren, müssen Sie die Oracle-Datenbank installieren und einen Datenbankbenutzer zum Testen erstellen. Sie können den Oracle-Client von der offiziellen Website von Oracle herunterladen und die Version auswählen, die Ihrer Betriebssystemversion zur Installation entspricht.

  1. C-Code schreiben

Das Folgende ist ein Beispielcode, der mithilfe der C-Sprache eine gespeicherte Oracle-Prozedur aufruft, die die angegebenen Datensätze in der Benutzertabelle abfragt.

#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. Führen Sie den Code aus

Nachdem wir den C-Code geschrieben haben, müssen wir den Code kompilieren und ausführen, um zu testen, ob die gespeicherte Prozedur erfolgreich aufgerufen werden kann.

Der Befehl zum Kompilieren von C-Code lautet wie folgt:

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

wobei $ORACLE_HOME der Installationspfad des Oracle-Clients ist.

Für die Kompilierung auf der Windows-Plattform müssen Sie -lclntsh改为-locci.

  1. Fazit

In diesem Artikel wird erläutert, wie Sie mithilfe der C-Sprache die gespeicherte Prozedur der Oracle-Datenbank aufrufen. Es ist zu beachten, dass der Installationspfad des Oracle-Clients eingerichtet werden muss und die Kompilierung des C-Programms auf die richtige Bibliotheksdatei verweisen muss. Bei der eigentlichen Entwicklungsarbeit müssen Sie auch auf das Schreiben gespeicherter Prozeduren und die Sicherheitsverarbeitung achten.

Das obige ist der detaillierte Inhalt vonSo rufen Sie die gespeicherte Prozedur der Oracle-Datenbank mit der Sprache C auf. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn