int f_excute_DynamicSQL(char * DynamicSQL_str)
{
int find_result_len=0;
int str1_len=0;
char substr_result1[2002]="";
char substr_result2[2002]="";
char find_result_temp[2002]="";
char substr_result[]="";
char tempStr[]="";
/* ***** 宿主变量定义 ***** */
EXEC SQL BEGIN DECLARE SECTION;
char C_PROCJECT_NAME[16]="";
char C_PROCJECT_TEACHER[101]="";
char Dynamic_SQL[1000]="";
char subkey_sql[2001]="";
int i_count = 0;
EXEC SQL END DECLARE SECTION;
strcpy(subkey_sql,"");
for(int a=1;;)
{
char str1[]="@WORK_DATE";
//重置
strcpy(substr_result1,"");
strcpy(substr_result2,"");
if(strcmp(subkey_sql,"")==0)
strcpy(subkey_sql,DynamicSQL_str);
//strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。
//如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
//strstr("Helloworld!","world");输出world!
char *find_result=strstr(subkey_sql,str1);
EDLog(1,1,"find_result=[%s]",find_result);
strcpy(find_result_temp,find_result);
if(!find_result)
break;
//变量find_result_len需要定义为静态局部变量;如果直接使用int find_result_len=strlen(find_result);
//在使用一次之后虽然没有赋值语句,但是变量的值依然被改变了(不知道为什么会被改变)
//静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,
//它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见,每次被调用都使用上一次的值。
find_result_len=strlen(find_result);
//将第二个参数字符串中截取(默认从0开始截取)长度为str1的长度的字符复制到第一个参数中
strncpy(substr_result,find_result+strlen(str1),find_result_len-strlen(str1));
//应为strncpy()函数截取时第二个参数的长度大于或等于要截取的长度,导致结果字符串不是以\0结尾
//会多出一些数字,因此需要手动将结尾置为\0(结束符)
if(find_result_len-strlen(str1)>0)
substr_result[find_result_len-strlen(str1)]='\0';
//strncpy返回一个char*类型(指针类型),转为char[]时需要指定char[]的长度,否则出现乱码
sprintf(substr_result1," :C_WORK_DATE %s ",substr_result);
//获取strstr()函数对比结果之后母字符串子串之前的字符串,该句执行之后substr_result的也会跟着改变
//因此该句必须在将substr_result的结果保存之后再执行
strncpy(tempStr,subkey_sql,strlen(subkey_sql)-find_result_len);
if(strlen(subkey_sql)-(strlen(subkey_sql)-find_result_len)>0)
substr_result[strlen(subkey_sql)-find_result_len+1]='\0';
sprintf(substr_result2," %s",tempStr);
sprintf(subkey_sql,"%s%s",substr_result2,substr_result1);
}
//准备动态SQL
EXEC SQL PREPARE DynamicSQL FROM :subkey_sql;
//定义动态SQL对应的游标
EXEC SQL DECLARE testTable_q1 CURSOR FOR DynamicSQL;
//打开游标;USING后跟参数列表,顺序严格要求
EXEC SQL OPEN testTable_q1 USING :C_WORK_DATE;
for (fetchRowCount2 = 0; ;)
{
EXEC SQL FETCH testTable_q1
INTO :C_PROCJECT_NAME,/*自定义变量*/
:C_PROCJECT_TEACHER;
}
EXEC SQL CLOSE tmmirl2zshj_q1 ;
}