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

时间:2016-06-17 17:39:13

标签: c stored-procedures oci

我正在调用另一台服务器中的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秒执行此功能。我只需要提示搜索内容或代码示例,谢谢!

1 个答案:

答案 0 :(得分:0)

  

我只需要提示搜索内容或代码示例

#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;
}