在c中生成动态sql

时间:2013-02-02 06:19:25

标签: sql c oracle proc

我必须生成一个可以生成动态更新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

但是当我执行它时,程序会挂起。有人可以告诉我应该是什么 执行第二功能的理想方法。

1 个答案:

答案 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文件。