2016-06-17 25 views
0

다른 서버에있는 Oracle 저장 프로 시저를 호출하고 있습니다. 따라서 네트워크 문제가 발생하면 OCI_Execute (statement)에서 응용 프로그램이 "멈춤"합니다.C - 저장 프로 시저 호출 시간 제한 설정 (ocilib)

이 SP 실행 시간 초과를 설정해야하거나 연결 상태를 확인해야 할 때 일반적인 방법이 무엇인지 알 수 없습니다. 어떻게 프로그램이 네트워크에 장애가 발생하면 내동댕이 - OCI_Execute(stmt); -,이 기능 execStoredProc의 첫 번째 줄에 있어요

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

내가 말했듯이 : 여기

무엇 내가 뭘의 예입니다 이 함수를 실행하려면 예를 들어 5 초를 설정합니다. 검색 할 내용이나 코드 예제에 대한 힌트가 필요합니다. 감사합니다.

답변

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