动态SQL语句写法
炽翼铁冰
posted @ 2009年11月20日 07:31
in C(转载)
, 4095 阅读
一、下面的这段动态SQl代码只是对从数据库中表中取得固定个数的字段的时候加以使用:
int TestTabPre()
{
EXEC SQL BEGIN DECLARE SECTION;
int countFlag;
VARCHAR dynstmt[5000];
char SubSQL [5000];
char A_char[100];
EXEC SQL END DECLARE SECTION;
memset(SubSQL,0,sizeof(SubSQL));
/*动态SQL的生成*/
strcpy(SubSQL,"SELECT ");
strcat(SubSQL," A");
strcat(SubSQL," FROM TBL_WKKTDAYKEIREKI");
strcat(SubSQL," WHERE NO = '");
strcat(SubSQL,"020316");
strcat(SubSQL,"'");
/*动态SQL的在数据库中解析*/
strcpy((char *)dynstmt.arr,SubSQL);
dynstmt.len = (unsigned short)strlen((char *)dynstmt.arr);
EXEC SQL PREPARE S FROM :dynstmt;
EXEC SQL DECLARE CC CURSOR FOR S;
/*动态SQL的在游标的打开*/
EXEC SQL OPEN CC ;
if(sqlca.sqlcode != 0)
{
/*游标的打开ERROR*/
return -1;
}
for(;;)
{
memset(A_char,0,sizeof(A_char));
EXEC SQL FETCH CC INTO :A_char;
if(sqlca.sqlcode ==0 )
{
/*游标的打开成功*/
...
}
else if(sqlca.sqlcode ==1403)
{
/*游标的打开完毕*/
break;
}
else
{
/*游标fetch中出现ERROR*/
EXEC SQL CLOSE CC ;
return -1;
}
} /*end for*/
EXEC SQL CLOSE CC ;
return 0;
}
{
EXEC SQL BEGIN DECLARE SECTION;
int countFlag;
VARCHAR dynstmt[5000];
char SubSQL [5000];
char A_char[100];
EXEC SQL END DECLARE SECTION;
memset(SubSQL,0,sizeof(SubSQL));
/*动态SQL的生成*/
strcpy(SubSQL,"SELECT ");
strcat(SubSQL," A");
strcat(SubSQL," FROM TBL_WKKTDAYKEIREKI");
strcat(SubSQL," WHERE NO = '");
strcat(SubSQL,"020316");
strcat(SubSQL,"'");
/*动态SQL的在数据库中解析*/
strcpy((char *)dynstmt.arr,SubSQL);
dynstmt.len = (unsigned short)strlen((char *)dynstmt.arr);
EXEC SQL PREPARE S FROM :dynstmt;
EXEC SQL DECLARE CC CURSOR FOR S;
/*动态SQL的在游标的打开*/
EXEC SQL OPEN CC ;
if(sqlca.sqlcode != 0)
{
/*游标的打开ERROR*/
return -1;
}
for(;;)
{
memset(A_char,0,sizeof(A_char));
EXEC SQL FETCH CC INTO :A_char;
if(sqlca.sqlcode ==0 )
{
/*游标的打开成功*/
...
}
else if(sqlca.sqlcode ==1403)
{
/*游标的打开完毕*/
break;
}
else
{
/*游标fetch中出现ERROR*/
EXEC SQL CLOSE CC ;
return -1;
}
} /*end for*/
EXEC SQL CLOSE CC ;
return 0;
}
二、对于从数据库一个表中取得不固定的字段,并且这些字段的数据类型也不明确时,就要使用数据库(Oracle)自带结构体来解决。
EXEC SQL INCLUDE sqlda;
SQLDA * select_dp;
int DbOperate(char * sql,char * id, char * name)
{
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR dynstmt[5000];
char SubSQL [5000];
EXEC SQL VAR SubSQL IS STRING(5000);
EXEC SQL END DECLARE SECTION;
char strid[6];
int i,null_ok,precision,scale;
char foruda[100];
memset(strid,0,sizeof(strid));
memset(foruda,0,sizeof(foruda));
/* if (access(KARI_FILE_PATH,0) != 0)
{
sprintf(foruda,"mkdir -m 777 ../%s",FindSelect(KARI_FILE_PATH));
system(foruda);
}*/
i = setjmp(jmp_continue);
/*不定的SQL的传入*/
strcpy(SubSQL,sql);
/*SQL的解析*/
strcpy((char *)dynstmt.arr,SubSQL);
dynstmt.len = (unsigned short)strlen((char *)dynstmt.arr);
memset(select_dp,0,sizeof(select_dp));
EXEC SQL PREPARE S FROM :dynstmt;
if(sqlca.sqlcode != 0)
{
printf("sqlca.sqlcode =[%d]\r\n",sqlca.sqlcode);
/*ERROR*/
return -1;
}
EXEC SQL DECLARE CC CURSOR FOR S;
EXEC SQL OPEN CC;
if(sqlca.sqlcode != 0)
{
printf("sqlca.sqlcode =[%d]\r\n",sqlca.sqlcode);
return -1;
}
/*SQL的所需最大的字段的条数*/
select_dp->N = MAX_ITEMS;
EXEC SQL DESCRIBE SELECT LIST FOR S INTO select_dp;
if(sqlca.sqlcode != 0)
{
printf("sqlca.sqlcode =[%d]\r\n",sqlca.sqlcode);
return -1;
}
memset(select_dp,0,sizeof(select_dp));
if(select_dp->F<0)
{
return -1;
}
/*重新设置最大条数*/
select_dp->N = select_dp->F;
for(i=0;i<select_dp->F;i++)
{
sqlnul(&(select_dp->T[i]),&(select_dp->T[i]),&null_ok);
/*类型的转化*/
switch(select_dp->T[i])
{
case 1:
select_dp->L[i]=select_dp->L[i] * 2 + 4;
break;
case 2:
sqlprc(&(select_dp->L[i]),&precision,&scale);
if(precision==0) precision =40;
select_dp->L[i]=precision+2;
break;
case 8:select_dp->L[i]=240;
break;
case 11:
select_dp->L[i]=18;
break;
case 12:
select_dp->L[i]=9;
break;
case 23:
break;
case 96:
select_dp->L[i]=select_dp->L[i] + 2;
case 24:
select_dp->L[i]=240;
break;
}
select_dp->V[i]=(char *)realloc(select_dp->V[i],select_dp->L[i]+1);
if(select_dp->T[i]!=24)
{
select_dp->T[i]=5;
}
}
if(sqlca.sqlcode != 0)
{
printf("sqlca.sqlcode =[%d]\r\n",sqlca.sqlcode);
ProcDBerror();
/*ERROR*/
return -1;
}
for(;;)
{
EXEC SQL WHENEVER SQLERROR DO ProcDBerror();
EXEC SQL AT :gbDb_name FETCH CC USING DESCRIPTOR select_dp;
if(sqlca.sqlcode ==0 )
{
for(i=0;i<select_dp->F;i++)
{
printf("entry=[%s]\n".select_dp->V[i]);
}
}
else if( sqlca.sqlcode==1403 )
{
break;
}
else
{
return -1;
}
}/* for(;;)end*/
/*free 释放空间*/
for(i=0;i<MAX_ITEMS;i++)
{
free(select_dp->I[i]);
free(select_dp->V[i]);
}
sqlclu(select_dp);
EXEC SQL AT :gbDb_name CLOSE CC;
EXEC SQL AT :gbDb_name COMMIT WORK RELEASE;
}/*end else*/
/*sprintf(path,"iconv -c -f UTF-8 -t shift_jis %s >%s",csvfilepath,id);*/
/*system(path);*/
return 0;
}
SQLDA * select_dp;
int DbOperate(char * sql,char * id, char * name)
{
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR dynstmt[5000];
char SubSQL [5000];
EXEC SQL VAR SubSQL IS STRING(5000);
EXEC SQL END DECLARE SECTION;
char strid[6];
int i,null_ok,precision,scale;
char foruda[100];
memset(strid,0,sizeof(strid));
memset(foruda,0,sizeof(foruda));
/* if (access(KARI_FILE_PATH,0) != 0)
{
sprintf(foruda,"mkdir -m 777 ../%s",FindSelect(KARI_FILE_PATH));
system(foruda);
}*/
i = setjmp(jmp_continue);
/*不定的SQL的传入*/
strcpy(SubSQL,sql);
/*SQL的解析*/
strcpy((char *)dynstmt.arr,SubSQL);
dynstmt.len = (unsigned short)strlen((char *)dynstmt.arr);
memset(select_dp,0,sizeof(select_dp));
EXEC SQL PREPARE S FROM :dynstmt;
if(sqlca.sqlcode != 0)
{
printf("sqlca.sqlcode =[%d]\r\n",sqlca.sqlcode);
/*ERROR*/
return -1;
}
EXEC SQL DECLARE CC CURSOR FOR S;
EXEC SQL OPEN CC;
if(sqlca.sqlcode != 0)
{
printf("sqlca.sqlcode =[%d]\r\n",sqlca.sqlcode);
return -1;
}
/*SQL的所需最大的字段的条数*/
select_dp->N = MAX_ITEMS;
EXEC SQL DESCRIBE SELECT LIST FOR S INTO select_dp;
if(sqlca.sqlcode != 0)
{
printf("sqlca.sqlcode =[%d]\r\n",sqlca.sqlcode);
return -1;
}
memset(select_dp,0,sizeof(select_dp));
if(select_dp->F<0)
{
return -1;
}
/*重新设置最大条数*/
select_dp->N = select_dp->F;
for(i=0;i<select_dp->F;i++)
{
sqlnul(&(select_dp->T[i]),&(select_dp->T[i]),&null_ok);
/*类型的转化*/
switch(select_dp->T[i])
{
case 1:
select_dp->L[i]=select_dp->L[i] * 2 + 4;
break;
case 2:
sqlprc(&(select_dp->L[i]),&precision,&scale);
if(precision==0) precision =40;
select_dp->L[i]=precision+2;
break;
case 8:select_dp->L[i]=240;
break;
case 11:
select_dp->L[i]=18;
break;
case 12:
select_dp->L[i]=9;
break;
case 23:
break;
case 96:
select_dp->L[i]=select_dp->L[i] + 2;
case 24:
select_dp->L[i]=240;
break;
}
select_dp->V[i]=(char *)realloc(select_dp->V[i],select_dp->L[i]+1);
if(select_dp->T[i]!=24)
{
select_dp->T[i]=5;
}
}
if(sqlca.sqlcode != 0)
{
printf("sqlca.sqlcode =[%d]\r\n",sqlca.sqlcode);
ProcDBerror();
/*ERROR*/
return -1;
}
for(;;)
{
EXEC SQL WHENEVER SQLERROR DO ProcDBerror();
EXEC SQL AT :gbDb_name FETCH CC USING DESCRIPTOR select_dp;
if(sqlca.sqlcode ==0 )
{
for(i=0;i<select_dp->F;i++)
{
printf("entry=[%s]\n".select_dp->V[i]);
}
}
else if( sqlca.sqlcode==1403 )
{
break;
}
else
{
return -1;
}
}/* for(;;)end*/
/*free 释放空间*/
for(i=0;i<MAX_ITEMS;i++)
{
free(select_dp->I[i]);
free(select_dp->V[i]);
}
sqlclu(select_dp);
EXEC SQL AT :gbDb_name CLOSE CC;
EXEC SQL AT :gbDb_name COMMIT WORK RELEASE;
}/*end else*/
/*sprintf(path,"iconv -c -f UTF-8 -t shift_jis %s >%s",csvfilepath,id);*/
/*system(path);*/
return 0;
}