使用Pro * C编程时如何知道SQL是否成功执行?

时间:2012-10-17 13:49:19

标签: c oracle oracle-pro-c

我最近使用Pro * C编程来访问Oracle数据库,如下所示:

cmd[128];
dpc_set_sqlca(&sqlca);
strcpy(cmd,"EXECUTE IMMEDIATE");
dpc_exec_immediate(sql_string);
SQLCODE = sqlca.sqlcode;

如何知道SQL是否已成功执行?

例如,如何知道oracle DB中是否存在表? 如何知道INSERT语句是否成功执行?

1 个答案:

答案 0 :(得分:3)

首先在Pro * C中,可以使用EXEC SQL指令直接执行SQL语句,例如

EXEC SQL INSERT INTO.... VALUES...

所有其他SQL语句都可以以相同的方式执行。每个Pro * C使用SQLCA.H头文件,如EXEC SQL INCLUDE SQLCA.H;该行告诉Pro * C预编译器该程序具有需要在其中解释的SQL语句。

动态sql也可以在Pro * C中执行,如

char *cmd = "INSERT INTO emp VALUES(1234, 'jon', 3)";
EXEC SQL PREPARE q FROM :cmd;
EXEC SQL EXECUTE q;

或者

char cmd[255] = "TRUNCATE TABLE tab_name";
EXEC SQL EXECUTE IMMEDIATE :cmd;

**注意:符号,这表示该变量是SQL引擎的绑定变量。

现在进入异常处理。下面是一些可用于处理Pro * C中的SQL错误的示例 -

  EXEC SQL INSERT INTO .... VALUES...;
  if SQL_ERROR_FOUND  //Exception Handling starts
  {
       sprintf(err_data,"INSERT/SELECT");                  
       //write error to log file, use SQLCODE to see what particular error happened
       return(-1);
  }

光标打开 -

 EXEC SQL OPEN c_cursor;
 if SQL_ERROR_FOUND   //Exception Handling starts
 {
    sprintf(err_data,"CURSOR FETCH: cursor=c_item");
    //write error to log file
    return(-1);
 }
 else if NO_DATA_FOUND
 {//do something
 }

或者使用动态SQL -

 EXEC SQL EXECUTE IMMEDIATE :cmd;
  if SQL_ERROR_FOUND
  {
        sprintf(err_data,"EXECUTE DYNAMIC STATEMENT %s", cmd); 
        //write error to log file 
        return(FATAL);
  }

依此类推......请记住,异常/错误处理if..else应该位于您希望处理错误的EXEC SQL <statement>之下。

SQLCODE (sqlca.sqlcode)是最常用的错误代码。宣称为长期的 该计划的最高层,最好是在SQLCA.H作为long SQLCODE;后加入。 在每个SQL语句之后,Oracle会填充SQLCODE并保留Oracle服务器错误号。此代码也可用于错误处理和日志记录。