免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2968 | 回复: 4
打印 上一主题 下一主题

请教informix动态语句问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-02 08:39 |只看该作者 |倒序浏览
各位高手:
      我写的一个函数中有这样一个动态语句,就是要根据传来的表名参数确定该表中记录的个数并存入变量,请问该如何实现?prepare好像不支持select  ... into 这样的语句啊!
      
动态语句基本是这个样子的:
   select count(*) into $num from <table>

论坛徽章:
0
2 [报告]
发表于 2007-07-02 10:26 |只看该作者
prepare :id from :sql_stmt;
execute :id into :host_var;

论坛徽章:
0
3 [报告]
发表于 2007-07-02 10:30 |只看该作者
给你个例子就是

  1. /* 0 - succ
  2. * <0 - error
  3. * >0 - warn
  4. */
  5. int
  6. get_complain_tms(
  7. exec sql begin declare section;
  8.   parameter char *bran,
  9.   parameter int *cnt
  10. exec sql end   declare section;
  11. )
  12. {
  13.   static char alrdy_prprd;
  14.   exec sql begin declare section;
  15.     char *pr_id = (char *)__func__;
  16.   exec sql end   declare section;

  17.   *cnt = 0.0f;

  18.   if (alrdy_prprd == 0) {
  19.     sprintf(stmt, "select count(*) from m_sfa_mng_input where date <= ? and opun_cod = ?");
  20. /*
  21. WARN("stmt %s", stmt);
  22. */
  23.     exec sql prepare :pr_id from :stmt;
  24.     if (SQLCODE) {
  25.       WARN("SQLCODE %d, msg %s", SQLCODE, sql_err_msg());
  26.       return (-1);
  27.     }
  28.     alrdy_prprd ++;
  29.   }

  30.   exec sql execute :pr_id into :*cnt using :bran, :wrkdt;
  31.   if (SQLCODE < 0) {
  32.     WARN("SQLCODE %d, msg %s", SQLCODE, sql_err_msg());
  33.     return (-1);
  34.   }

  35.   return (SQLCODE == SQLNOTFOUND);
  36. }

复制代码

[ 本帖最后由 ivhb 于 2007-7-2 10:33 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-07-02 14:46 |只看该作者
原帖由 ivhb 于 2007-7-2 10:30 发表
给你个例子就是

  1. sprintf(stmt, "select count(*) from m_sfa_mng_input where date <= ? and opun_cod = ?");
复制代码


你这个例子中表名是固定的,而我要实现的语句中,仅有这个表名是动态的,而这也恰恰是prepare所不支持的

论坛徽章:
0
5 [报告]
发表于 2007-07-02 15:34 |只看该作者
怎么不支持呢?
你可以动手实验一下的
string *id = (char *)__func__;

sprintf(stmt, "select count(*) from %s", tabname);
exec sql prepare :id from :stmt;
exec sql execute :id into :cnt;
你看看能不能用?

我所以举这个例子,是因为一般情况,我们使用prepare是为了提高效率。避免反复的分析执行计划。
因此一次prepare,多次using执行。当前前提是表结构,结果字段,where条件字段都已确定,只是where
条件的值不确定。这个是典型的使用prepare的情形。

像你这的要求,只能通过每次prepare来执行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP