C++开发学习笔记:Proc中执行动态SQL

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 ;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值