field 发表于 2007-07-02 08:39

请教informix动态语句问题!

各位高手:
      我写的一个函数中有这样一个动态语句,就是要根据传来的表名参数确定该表中记录的个数并存入变量,请问该如何实现?prepare好像不支持select... into 这样的语句啊!
      
动态语句基本是这个样子的:
   select count(*) into $num from <table>

ivhb 发表于 2007-07-02 10:26

prepare :id from :sql_stmt;
execute :id into :host_var;

ivhb 发表于 2007-07-02 10:30

给你个例子就是

/* 0 - succ
* <0 - error
* >0 - warn
*/
int
get_complain_tms(
exec sql begin declare section;
parameter char *bran,
parameter int *cnt
exec sql end   declare section;
)
{
static char alrdy_prprd;
exec sql begin declare section;
    char *pr_id = (char *)__func__;
exec sql end   declare section;

*cnt = 0.0f;

if (alrdy_prprd == 0) {
    sprintf(stmt, "select count(*) from m_sfa_mng_input where date <= ? and opun_cod = ?");
/*
WARN("stmt %s", stmt);
*/
    exec sql prepare :pr_id from :stmt;
    if (SQLCODE) {
      WARN("SQLCODE %d, msg %s", SQLCODE, sql_err_msg());
      return (-1);
    }
    alrdy_prprd ++;
}

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

return (SQLCODE == SQLNOTFOUND);
}



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

field 发表于 2007-07-02 14:46

原帖由 ivhb 于 2007-7-2 10:30 发表
给你个例子就是

sprintf(stmt, "select count(*) from m_sfa_mng_input where date <= ? and opun_cod = ?");


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

ivhb 发表于 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来执行。
页: [1]
查看完整版本: 请教informix动态语句问题!