【问题标题】:How to know whether SQL is successfully executed when programming using Pro*C?使用Pro*C编程时如何知道SQL是否执行成功?
【发布时间】:2012-10-17 13:49:18
【问题描述】:

我最近使用 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语句是否执行成功?

【问题讨论】:

  • 不同于SQLSTATESQLCODEsqlca.sqlcode,如the manual 中所述? (像这样手动设置SQLCODE 可能不是一个好主意,但如果两者都被声明,它们无论如何都应该具有相同的值)。这还提到使用sqlca.sqlerrd[2] 来获取处理的行数。

标签: c oracle oracle-pro-c


【解决方案1】:

首先在Pro*C中,SQL语句可以直接执行,通过EXEC 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; 之后。 SQLCODE 由 Oracle 在每个 SQL 语句之后填充,并保存 Oracle 服务器错误号。此代码也可用于错误处理和日志记录。

【讨论】:

  • if SQL_ERROR_FOUND 是有效代码还是只是伪代码? SQL_ERROR_FOUND 是某个自定义宏吗?
  • 定义为#define SQL_ERROR_FOUND (SQLCODE != 0 && SQLCODE != 1403)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 2011-07-02
  • 2011-08-10
  • 2010-11-02
相关资源
最近更新 更多