【问题标题】:generating dynamic sql in c [closed]在c中生成动态sql [关闭]
【发布时间】:2013-02-02 06:19:24
【问题描述】:

我要生成一个可以生成动态更新sql并执行的c程序。 表名、要更新的列数和 where 子句中的列是已知的 只在运行时。所以我把我的程序分成两个函数:

1)CheckTableExists - 检查用户提供的表是否存在于数据库中。 成功实施。

2)UpdateFunc - 根据用户提供的数据生成sql字符串并执行
查询。

我在第二个函数中遇到问题。我不接受任何列、名称和值 从用户更新。然后我使用 for 循环并将名称和值附加到我的 sql 字符串:

sqlstring = 更新标签名 set colname = colval,colname = colval where

然后我接受 where 子句数据并将其附加到我的字符串中。所以我的最后一个字符串是:

sqlstring = 更新选项卡名 set colname = colval,colname = colval where whcolname = whcolval

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

【问题讨论】:

  • 您的确切 SQL 字符串是什么样的?您可以直接在您的 RDBMS 中运行它吗?除非您的值是 varchars 并且需要撇号,否则上面的任何内容都看起来不正确。
  • Pro*C?为什么要为WHERE 子句取参数,只需以string 格式进行完整查询并执行EXEC SQL EXECUTE IMMEDIATE :strSQL;
  • 好吧,我真的怀疑我们是否需要将主机变量传递给 strSQL。所以我的字符串可以像这样 EXEC SQL Update tabname set colname= colval where whcolname = whcolval.以上都是c char arryays
  • 我其实是用一个代码来做参考的。该代码动态选择数据。 sqlstring 是使用 sprintf 生成的: sprintf(SqlString.arr,"EXEC SQL SELECT :fname,:last_name,:age from :tab_name where :id = :val"); fname,last_name,age,id 携带列名,tab_name -> 表名。但是所有这些都像结构一样从一个类传递到另一个类。所以这很容易。但我很困惑我应该如何生成那个字符串。
  • 将 Oracle 添加到帖子的标记名中。您使用: 的地方称为binding variables。我说的是在.PC proc 文件中没有绑定。如果所有列都是 Varchar/Int,那么您可以在 .PC 文件/函数之外准备一个有效的 SQL。在上述情况下,strSQL 是没有占位符的有效 SQL 语句。

标签: sql c oracle proc


【解决方案1】:

strSQL 将是一个有效的 SQL 语句,没有用于绑定的占位符。这适用于带有数字和 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 文件。

【讨论】:

  • thnx 会试着告诉你!!
  • 工作就像一个魅力!谢谢