我必须生成一个可以生成动态更新sql并执行它的c程序。 表名,要更新的列数和where子句中的列是已知的 只在运行时间。所以我将程序分成两个功能:
1) CheckTableExists - 检查用户提供的表是否存在于db中。 已成功实施。
2) UpdateFunc - 根据用户提供的数据生成sql字符串并执行
查询。
我在第二个函数中遇到问题。我不接受列,名称和值 从用户更新。然后我使用for循环并将名称和值附加到我的sql 字符串:
sqlstring =更新tabname set colname = colval,colname = colval where
然后我接受where子句数据并将其附加到我的字符串。所以我的最后一个字符串是:
sqlstring =更新tabname set colname = colval,colname = colval其中whcolname = whcolval
但是当我执行它时,程序会挂起。有人可以告诉我应该是什么 执行第二功能的理想方法。
答案 0 :(得分:2)
strSQL
将是一个有效的SQL语句,没有用于绑定的占位符。这适用于使用numeric和varchar2变量的查询。对于二进制文件,您可能必须在Oracle中实现bin2hex()和hex2bin()等函数。
一个简单的功能,如:
int Exec_Query(sql_context sqlCtx, char *strSQL)
{
// struct sqlca sqlca;
/* Sanity checks for sqlCtx and strSQL */
EXEC SQL WHENEVER SQLERROR GOTO QueryErr;
/* Set the context */
EXEC SQL CONTEXT USE :sqlCtx;
/* Execute the query */
EXEC SQL EXECUTE IMMEDIATE :strSQL;
EXEC SQL COMMIT;
return 0;
QueryErr:
/* printf("Err: Failure in Executing Query\n"); */
/* printf("Debug: <%s>",sqlca.sqlerrm.sqlerrmc); */
return -1;
}
通过Pro * C编译器可以提供有效的C文件。