C - 设置存储过程调用超时(ocilib)

标签 c stored-procedures oracle-call-interface

我正在调用另一台服务器中的 Oracle 存储过程。因此,如果出现网络问题,应用程序就会“卡在”OCI_Execute(语句)中。

我需要为此 SP 执行设置超时或者检查连接状态,我不知道通常的方法是什么。

这是我正在做的事情的示例:

#include <stdio.h>
#include <ocilib.h>

OCI_Connection *dbConn;
OCI_Statement *storedProcStmt;
otext *storedProcQuery = "BEGIN TEST_PROC (:param1,:param2,:result); END;";

int main()
{
    if(connectDB() != 0){
        return (1);
    }

    storedProcStmt = OCI_StatementCreate(dbConn);
    OCI_Prepare(storedProcStmt, storedProcQuery);

    char paramResult[3] = "";
    OCI_BindString(storedProcStmt, ":param1", "123", strlen("123"));
    OCI_BindString(storedProcStmt, ":param2", "abc", strlen("abc"));
    OCI_BindString(storedProcStmt, ":result", paramResult, 2);

    execStoredProc(storedProcStmt);

    printf("RESULT:\n");
    printf("%s\n", paramResult);

    return (0);
}

int connectDB()
{
    if (!OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT))
        return (EXIT_FAILURE);

    dbConn = OCI_ConnectionCreate("xe", "user", "password", OCI_SESSION_DEFAULT);

    if (dbConn == NULL)
    {
        printf("Could not connect to DB\n");
        return (1);
    }

    printf("Connected to DB\n");

    return (0);
}

int execStoredProc(OCI_Statement *stmt)
{
    OCI_Execute(stmt);
    OCI_Commit(dbConn);
    OCI_StatementFree(stmt);
}

正如我所说,它位于函数execStoredProc的第一行 -OCI_Execute(stmt); - 网络故障时程序卡住的地方,我该怎么办设置此函数执行的限制,例如 5 秒。我只需要提示要搜索的内容或代码示例,谢谢!

最佳答案

I just need a hint of what to search or a code example

#include <setjmp.h>
#include <signal.h>
#include <unistd.h>
jmp_buf env;
void handler(int signum) { longjmp(env, 1); }

int execStoredProc(OCI_Statement *stmt)
{
    int err = 1;
    if (!setjmp(env))
    {
        signal(SIGALRM, handler);
        alarm(5);
        OCI_Execute(stmt);
        alarm(0);
        err = 0;
        OCI_Commit(dbConn);
    }
    OCI_StatementFree(stmt);
    return err;
}

关于C - 设置存储过程调用超时(ocilib),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37887319/

相关文章:

c - 将四字移动到 %RDI 的操作码

'for' 循环内的 'for' 循环是否可以使用相同的计数器变量名称?

MySQL 过程返回空

c - ORA-01008 : not all variables bound (in C w OCI)

dprintf 的跨平台兼容性

c - 概括 Qx_TO_Qy 宏?

Python Mysql类调用存储过程

MySQL - 跳转到存储过程中的 "foo:Begin"

java - ocijdbc11 在 java.library.path 中找不到

c++ - Oracle OCI 获取最后插入行的 ID