按照armyjiang的建议,我将所有主变量全部在declare section中定义,但是问题依然存在。而且发现在测试代码中按不同顺序调用这些函数,结果不同,原本执行正确的sql会出现1403,1458,24373等错误。以下代码是其中的一个函数,请帮我分析一下问题原因。我甚至怀疑是不是这个版本的proc有bug。曾经在AIX的oracle7.3上写过不少proc代码,从来也没遇到过这么奇怪的问题。
——————————————————————————————————————————————
#include
#include
#include "error.h"
#include "dbdata.h"
#include "dbdef.h"
extern void fatal_error (int);
extern void Format (char *);
EXEC SQL BEGIN DECLARE SECTION;
/* define the host variable and indicator */
VARCHAR v_symbol[10];
VARCHAR v_username[10];
/* define end */
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE sqlca.h;
/******************************************************************************
**** 函数名: db_user_indi_param
**** 功能: 从数据表RACS_TB_INDI_PARAS取出(username,time_period)相应的para
**** 输入参数:
**** username: char
**** time_period: int
****
**** 输出结果:
**** 0:正常
**** 1:错误
**** 2:没有symbol
**** para:当为正常时、返回相应值,否则返回空
*******************************************************************************/
int db_user_indi_param(char *symbol, int time_period,char *para)
{
EXEC SQL BEGIN DECLARE SECTION;
int v_time_period;
VARCHAR v_param[4001];
EXEC SQL END DECLARE SECTION;
EXEC SQL WHENEVER SQLERROR DO ret = sqlerr_ctl ("db_user_indi_param", 0);
EXEC SQL WHENEVER NOT FOUND DO ret = sqlnotfound_ctl ("db_user_indi_param"
;
int ret = 0;
Format(symbol);
if (!(strcasecmp (symbol, ""
))
return ret = 1;
safeStrncpy(v_symbol.arr, symbol, 10);
v_symbol.len = strlen(v_symbol.arr);
v_time_period = time_period;
/* first connect the database */
#ifdef _ORACLE_EACH_
if (db_open ())
fatal_error (DATABASE_ERR);
#endif //_ORACLE_EACH_
if (!db_symbol_exist(symbol)) return 2;
EXEC SQL SELECT param INTO :v_param
FROM racs_tb_indi_paras
WHERE symbol = UPPER(:v_symbol)
AND datatype =:v_time_period;
if (ret) {
if (ret == NOT_FOUND) ret = 0;
para[0] = '\0';
}
else {
Format (v_param.arr);
safeStrncpy (para, v_param.arr, 4000);
}
#ifdef _ORACLE_EACH_
db_close ();
#endif //_ORACLE_EACH_
return ret;
}