请教informix动态语句问题!
各位高手:我写的一个函数中有这样一个动态语句,就是要根据传来的表名参数确定该表中记录的个数并存入变量,请问该如何实现?prepare好像不支持select... into 这样的语句啊!
动态语句基本是这个样子的:
select count(*) into $num from <table> prepare :id from :sql_stmt;
execute :id into :host_var; 给你个例子就是
/* 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 编辑 ] 原帖由 ivhb 于 2007-7-2 10:30 发表
给你个例子就是
sprintf(stmt, "select count(*) from m_sfa_mng_input where date <= ? and opun_cod = ?");
你这个例子中表名是固定的,而我要实现的语句中,仅有这个表名是动态的,而这也恰恰是prepare所不支持的 怎么不支持呢?
你可以动手实验一下的
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]