gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:59:59 28 4
gpt4 key购买 nike

我正在调用另一台服务器中的 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com