免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 2915 | 回复: 21
打印 上一主题 下一主题

一个proc程序与编译的问题..... [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-02-28 15:41 |只看该作者 |倒序浏览
我的程序,前面先是一个cursor,在关闭cursor后,编译接下来的语句据出现这个错误:

  1. Error 306: "jh.c", line 663 # Break/continue must be inside switch or
  2.     iteration statement.
  3.          if (sqlca.sqlcode == 1403) break;
复制代码


如果,我将cursor注释掉之后,就不出现这个错误了.....

请问问题出在什么地方呢?

论坛徽章:
0
2 [报告]
发表于 2003-02-28 15:44 |只看该作者

一个proc程序与编译的问题.....

最好把你的代码较完整的贴出来!

这样大家可以比较清楚的分析!

论坛徽章:
0
3 [报告]
发表于 2003-02-28 15:52 |只看该作者

一个proc程序与编译的问题.....



  1. #include <stdio.h>;
  2. #include <stdlib.h>;
  3. int main(int argc,char *argv[])
  4. {
  5. EXEC SQL BEGIN DECLARE SECTION;
  6.      char auditSeq[10+1]={""};                                 
  7.      char beforefilename[100]={""};                          
  8.      char afterfilename[100]={""};                           
  9.      char sqlstr[2000]={""};                                 
  10.      char partitions[2+1]={""};                                   
  11.      char monthflag[1+1]={""};
  12.      char auditmonth[2+1]={""};
  13.      
  14.      char auditTable[50]={""};                  
  15.      char auditErrTable[50]={""};            
  16.      char auditTable_bak[50]={""};         
  17.      char auditErrTable_bak[50]={""};   
  18.      
  19.      char roamOutTable[50]={""};
  20.      char mergeTable[50]={""};
  21.      char repeatTable[50]={""};
  22.      char billTable[50]={""};
  23.      char areacode[3+1]={"434"};
  24.      char auditdate[8+1]={"20030223"};
  25.    EXEC SQL END DECLARE SECTION;
  26.    EXEC SQL INCLUDE sqlca;
  27.     auditmonth[0]=auditdate[4];
  28.     auditmonth[1]=auditdate[5];
  29.     auditmonth[2]=0;
  30.    
  31.     switch(atoi(auditmonth))
  32.     {
  33.      case 1:
  34.      case 7:
  35.        monthflag[0]='1';break;
  36.      case 2:
  37.      case 8:
  38.        monthflag[0]='2';break;
  39.      case 3:
  40.      case 9:
  41.        monthflag[0]='3';break;
  42.      case 4:
  43.      case 10:
  44.        monthflag[0]='4';break;
  45.      case 5:
  46.      case 11:
  47.        monthflag[0]='5';break;
  48.      case 6:
  49.      case 12:
  50.        monthflag[0]='6';break;
  51.     }   
  52.     monthflag[1]=0;
  53.    
  54.     //表分区
  55.     partitions[0]=auditdate[6];
  56.     partitions[1]=auditdate[7];
  57.     partitions[2]=0;
  58.     //表后缀
  59.     sprintf(roamOutTable,"Log_Audit_Roam_Out_GSM_%s_%s",areacode,monthflag);
  60.     sprintf(auditTable,"Log_Fee_Audit_%s",areacode);
  61.     sprintf(auditErrTable,"Log_Fee_Audit_Err_%s",areacode);
  62.     sprintf(auditTable_bak,"Log_Fee_Audit_Hist_%s",areacode);
  63.     sprintf(auditErrTable_bak,"Log_Fee_Audit_Err_Hist_%s",areacode);
  64.       
  65.     EXEC SQL SELECT auditing.SEQ_FEE_AUDIT.nextval INTO :auditSeq FROM dual;
  66.     sprintf(sqlstr,"insert into %s (Fee_Audit_Seq,Service_Type,Tele_Order_Deal_Moment,Tele_Order_Status,Call_Date,Fee_Audit_Begin_Date) values ('%s','GSM','RoamOut-Repeat','0',%s,sysdate)",auditTable,auditSeq,auditdate);
  67.     EXEC SQL EXECUTE IMMEDIATE :sqlstr;
  68.     sprintf(sqlstr,"SELECT distinct before_filename,after_filename FROM %s PARTITION(DAY%s)",roamOutTable,partitions);
  69.     EXEC SQL PREPARE RoamOutToRepeat FROM :sqlstr;
  70.     EXEC SQL DECLARE a CURSOR FOR RoamOutToRepeat;
  71.     EXEC SQL OPEN a;
  72.     for(;;){//--a
  73.      EXEC SQL WHENEVER NOT FOUND DO break;
  74.      EXEC SQL FETCH a INTO :beforefilename,:afterfilename;
  75.      printf("%s-----%s\n",beforefilename,afterfilename);
  76.      
  77.     }//--a

  78.      EXEC SQL CLOSE a;
  79.      sprintf(sqlstr,"update %s set Fee_Audit_End_Date=sysdate where Fee_Audit_Seq='%s'",auditTable,auditSeq);
  80.      EXEC SQL EXECUTE IMMEDIATE :sqlstr;
  81.      sprintf(sqlstr,"insert into %s select * from %s where Service_Type='GSM' and Tele_Order_Deal_Moment='RoamOut-Repeat' and Call_Date=%s",auditTable_bak,auditTable,auditdate);
  82.      EXEC SQL EXECUTE IMMEDIATE :sqlstr;
  83.      sprintf(sqlstr,"insert into %s select * from %s where Service_Type='GSM' and Tele_Order_Deal_Moment='RoamOut-Repeat' and Call_Date=%s",auditErrTable_bak,auditErrTable,auditdate);
  84.      EXEC SQL EXECUTE IMMEDIATE :sqlstr;
  85. }

复制代码

论坛徽章:
0
4 [报告]
发表于 2003-02-28 16:29 |只看该作者

一个proc程序与编译的问题.....

爷们儿,代码我贴出来了,怎么不看了?

论坛徽章:
0
5 [报告]
发表于 2003-03-01 13:37 |只看该作者

一个proc程序与编译的问题.....

出错的地方是这里
  1. ;
  2.     for(;;){//--a
  3.      EXEC SQL WHENEVER NOT FOUND DO break;
  4.      EXEC SQL FETCH a INTO :beforefilename,:afterfilename;
  5.      printf("%s-----%s\n",beforefilename,afterfilename);
  6.       
  7.     }//--a
复制代码



     EXEC SQL WHENEVER NOT FOUND DO break;
移动到for 前面看看

论坛徽章:
0
6 [报告]
发表于 2003-03-01 13:52 |只看该作者

一个proc程序与编译的问题.....

不好意思!昨天忙于解决自己问题上去了!没来得及看!

我目前意见和无双的一样!

你把顺序调整一下试试看!

论坛徽章:
0
7 [报告]
发表于 2003-03-01 15:41 |只看该作者

一个proc程序与编译的问题.....

原帖由 "无双" 发表:


     EXEC SQL WHENEVER NOT FOUND DO break;
移动到for 前面看看


应该是这样,如果不明白的话可以用proc编译.pc得到.c后,仔细看一看.c文件就知道是怎么回事了。

论坛徽章:
0
8 [报告]
发表于 2003-03-03 08:53 |只看该作者

一个proc程序与编译的问题.....



各位大侠,我将break那句提前之后,make还出现同样的问题啊?请各位再看看?

谢谢了

论坛徽章:
0
9 [报告]
发表于 2003-03-03 09:55 |只看该作者

一个proc程序与编译的问题.....

你这个是个死循环。
EXEC SQL WHENEVER NOT FOUND DO break;
这句话的意思是检测错误,
但是,如果cursor到最后一条不是错误。
是sqlca.sqlcode = 1403;
所以,你的程序在运行中,到纪录的最后一条后,仍然没有出循环,
所以,再fetch 时,出错。
不知道对不对,proc 我不是很熟,我是根据程序分析出来的。

论坛徽章:
0
10 [报告]
发表于 2003-03-03 10:05 |只看该作者

一个proc程序与编译的问题.....

补充说明一下。
刚才没有仔细看。仔细的看了你的问题。

" Error 306: "jh.c", line 663 # Break/continue must be inside switch or
    iteration statement.
         if (sqlca.sqlcode == 1403) break;"
在 exec sql 中不能有 break;
你还是用标准的if (sqlca.sqlcode == 1403) break;这句话吧。
在exec sql 中最好不要用于sql语法无关的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP