本帖最后由 zt735268255 于 2011-06-16 11:09:11 编辑

解决方案 »

  1.   

    1.定义变量请你不要使用@符号,不要习惯了sql server的写法,而拿到oracle中来用;
    2. OPEN audit_cursor ;
       loop
           fetch audit_cursor into ......
           ......
       end loop;
      

  2.   

    Compilation errors for PROCEDURE SZEMR.OUT_EMRError: PLS-00103: 出现符号 "FETCH"在需要下列之一时:
            constant exception
              <an identifier> <a double-quoted delimited-identifier> table
              LONG_ double ref char time timestamp interval date binary
              national character nchar
    Line: 53
    Text: FETCH audit_cursor INTO MRID1,iccardno,dia_date,admiss_times,MDESCRIPT1,MHISDESCRIPT1,CHECKUP1,CHECKASS1,COURSEREC1,DIAGNOSECONTENT,DIAGNOSERANGEError: PLS-00103: 出现符号 "IF"在需要下列之一时:
            . ( , % ; limit
    Line: 55
    Text: IF @@fetch_status <> 0 break
      

  3.   

    oracle每个语句要以分号“;"结束!!--打开游标
    open audit_cursor;
    loop
       FETCH audit_cursor INTO ....  ;--分号结尾
       EXIT WHEN audit_cursor%notfound; --判断取完则退出
       --其它处理语句
    end loop;
    --关闭游标
    close audit_cursor;建议先看看PL/SQL基础的书。
      

  4.   

    oracle的所有标识符、表名、都不能以@开头!!(除非使用双引号括起来)
      

  5.   

    create or replace procedure out_emr(
     MRID in varchar 

    IS MRID1 varchar(20);
     MRID2 varchar(20);
     dia_date varchar(30);
     iccardno varchar(20);
     MDESCRIPT varchar(8000);
     MHISDESCRIPT varchar(8000);
     CHECKUP varchar(8000);
     CHECKASS varchar(8000);
     COURSEREC varchar(8000);
     MDESCRIPT1 varchar(8000);
     MHISDESCRIPT1 varchar(8000);
     CHECKUP1 varchar(8000);
     CHECKASS1 varchar(8000);
     COURSEREC1 varchar(8000);
     admiss_times int ;
     DIAGNOSECONTENT varchar(60);
     DIAGNOSERANGE  nchar(1);begin
        execute immediate 'CREATE GLOBAL TEMPORARY TABLE ca_emr(
          MRID varchar(20),
          dia_date varchar(30),
          flag varchar(1) ,
          doctor varchar(5),
          iccardno varchar(20),
          MDESCRIPT long,
          MHISDESCRIPT long ,
          CHECKUP long  ,
          CHECKASS long ,
          COURSEREC long,
          admiss_times smallint ,
          DIAGNOSECONTENT varchar(60),
          DIAGNOSERANGE nchar(1)
        )
        on commit PRESERVE rows';
        
    DECLARE
        CURSOR  audit_cursor is    select mainmr.MRID, mainmr.papernum,inpatient.outdate, inpatient.admiss_times,inpatient.MDESCRIPT,
        inpatient.MHISDESCRIPT,inpatient.CHECKUP,inpatient.CHECKASS,inpatient.COURSEREC,alldiagnoserecord.DIAGNOSECONTENT,
        alldiagnoserecord.DIAGNOSERANGE from  mainmr,inpatient,alldiagnoserecord where mainmr.MRID=inpatient.MRID and 
        inpatient.MRID=alldiagnoserecord.sickid and mainmr.MRID=MRID and (diagnosecontent = '妊娠糖尿病' or 
        diagnosecontent = '2型糖尿病' or diagnosecontent = '1型糖尿病' or diagnosecontent = '特殊类型糖尿病' or diagnosecontent= '糖尿病') ;
                                       
      OPEN audit_cursor;
      loop
      FETCH audit_cursor INTO MRID1,iccardno,dia_date,admiss_times,MDESCRIPT1,MHISDESCRIPT1  ,CHECKUP1,CHECKASS1,COURSEREC1,DIAGNOSECONTENT,DIAGNOSERANGE
                  
      EXIT WHEN audit_cursor%NOTFOUND or audit_cursor%NOTFOUND is null;
          select MDESCRIPT=convert(varchar(8000),xmlcontent) from xmlfilerecord where xmlcontentid=MDESCRIPT1
          select CHECKUP=convert(varchar(8000),xmlcontent) from xmlfilerecord where xmlcontentid=CHECKUP1
          select CHECKASS=convert(varchar(8000),xmlcontent) from xmlfilerecord where xmlcontentid=CHECKASS1
          select COURSEREC=convert(varchar(8000),xmlcontent) from xmlfilerecord where xmlcontentid=COURSEREC1
            select MHISDESCRIPT=convert(varchar(8000),xmlcontent) from xmlfilerecord where xmlcontentid=MHISDESCRIPT1
          insert into #ca_emr(MRID,flag,iccardno,dia_date,admiss_times,MDESCRIPT,MHISDESCRIPT,CHECKUP,CHECKASS,COURSEREC,
          DIAGNOSECONTENT,DIAGNOSERANGE)  values(MRID1,'z',iccardno,dia_date,admiss_times,MDESCRIPT,
          MHISDESCRIPT,CHECKUP,CHECKASS,COURSEREC,DIAGNOSECONTENT,DIAGNOSERANGE)
      end loop;
      
      CLOSE audit_cursor
      DEALLOCATE audit_cursor
      
    end out_emr;
    Error: PLS-00103: 出现符号 "FETCH"在需要下列之一时:
            constant exception
              <an identifier> <a double-quoted delimited-identifier> table
              LONG_ double ref char time timestamp interval date binary
              national character nchar
    Line: 53
    Text: FETCH audit_cursor INTO MRID1,iccardno,dia_date,admiss_times,MDESCRIPT1,MHISDESCRIPT1Error: PLS-00103: 出现符号 "EXIT"在需要下列之一时:
            . ( , % ; limit
    Line: 56
    Text: EXIT WHEN audit_cursor%NOTFOUND or audit_cursor%NOTFOUND is null;还是不行,希望那个大哥帮我看看
      

  6.   


    MHISDESCRIPT1 varchar(8000)
    --varcahr2(4000)这是最大值,所有的字符型,最好使用varchar2替代EXIT WHEN audit_cursor%NOTFOUND--or audit_cursor%NOTFOUND is null;画蛇添足create table #t as select * from dept where 1=0--表的名称一字母开头
     
    ORA-00911: invalid character
      

  7.   

    Error: PLS-00103: 出现符号 "FETCH"在需要下列之一时:
            constant exception
              <an identifier> <a double-quoted delimited-identifier> table
              LONG_ double ref char time timestamp interval date binary
              national character nchar
    Line: 53
    Text: FETCH audit_cursor INTO MRID1,iccardno,dia_date,admiss_times,MDESCRIPT1,MHISDESCRIPT1Error: PLS-00103: 出现符号 "EXIT"在需要下列之一时:
            . ( , % ; limit
    Line: 56
    Text: EXIT WHEN audit_cursor%NOTFOUND
    该了还是报错啊,急死了
      

  8.   

     OPEN audit_cursor;
      loop
      FETCH audit_cursor INTO MRID1,iccardno,dia_date,admiss_times,MDESCRIPT1,MHISDESCRIPT1,CHECKUP1,CHECKASS1,COURSEREC1,DIAGNOSECONTENT,DIAGNOSERANGE;              
      EXIT WHEN audit_cursor%NOTFOUND;
          select MDESCRIPT =convert(varchar(8000),xmlcontent) from xmlfilerecord where xmlcontentid=MDESCRIPT1
          select CHECKUP=convert(varchar(8000),xmlcontent) from xmlfilerecord where xmlcontentid=CHECKUP1
          select CHECKASS=convert(varchar(8000),xmlcontent) from xmlfilerecord where xmlcontentid=CHECKASS1
          select COURSEREC=convert(varchar(8000),xmlcontent) from xmlfilerecord where xmlcontentid=COURSEREC1
            select MHISDESCRIPT=convert(varchar(8000),xmlcontent) from xmlfilerecord where xmlcontentid=MHISDESCRIPT1
          insert into #ca_emr(MRID,flag,iccardno,dia_date,admiss_times,MDESCRIPT,MHISDESCRIPT,CHECKUP,CHECKASS,COURSEREC,
          DIAGNOSECONTENT,DIAGNOSERANGE)  values(MRID1,'z',iccardno,dia_date,admiss_times,MDESCRIPT,
          MHISDESCRIPT,CHECKUP,CHECKASS,COURSEREC,DIAGNOSECONTENT,DIAGNOSERANGE)
      end loop;
      
      CLOSE audit_cursor
      DEALLOCATE audit_cursor
      
    end out_emr;
    Error: PLS-00103: 出现符号 "FETCH"在需要下列之一时:
            constant exception
              <an identifier> <a double-quoted delimited-identifier> table
              LONG_ double ref char time timestamp interval date binary
              national character nchar
    Line: 53
    Text: FETCH audit_cursor INTO MRID1,iccardno,dia_date,admiss_times,MDESCRIPT1,MHISDESCRIPT1,CHECKUP1,CHECKASS1,COURSEREC1,DIAGNOSECONTENT,DIAGNOSERANGE;Error: PLS-00103: 出现符号 "="在需要下列之一时:
            . ( , * @ % & - + / at mod
              rem <an identifier> <a double-quoted delimited-identifier>
              <an exponent (**)> as from into || bulk
    Line: 56
    Text: select MDESCRIPT =convert(varchar(8000),xmlcontent) from xmlfilerecord where xmlcontentid=MDESCRIPT1加了分号还是报错
      

  9.   


    OPEN audit_cursor;
      loop
      FETCH audit_cursor INTO 
      MRID1,iccardno,dia_date,admiss_times,MDESCRIPT1,MHISDESCRIPT1,
      CHECKUP1,CHECKASS1,COURSEREC1,DIAGNOSECONTENT,DIAGNOSERANGE
        
      EXIT WHEN audit_cursor%NOTFOUND;
      
      select convert(varchar(8000),xmlcontent) into MDESCRIPT from xmlfilerecord where xmlcontentid=MDESCRIPT1
      select convert(varchar(8000),xmlcontent) into CHECKUP from xmlfilerecord where xmlcontentid=CHECKUP1
      select convert(varchar(8000),xmlcontent) into CHECKASS from xmlfilerecord where xmlcontentid=CHECKASS1
      select convert(varchar(8000),xmlcontent) into COURSEREC from xmlfilerecord where xmlcontentid=COURSEREC1
      select convert(varchar(8000),xmlcontent) into MHISDESCRIPT from xmlfilerecord where xmlcontentid=MHISDESCRIPT1
      --添加数据时记得数据类型和个数要与表中的字段对齐
      --表的命名不要以 # 开始,将你的表改过,或者重建,前提是不损害你的数据
      insert into #ca_emr(MRID,flag,iccardno,dia_date,admiss_times,MDESCRIPT,MHISDESCRIPT,CHECKUP,CHECKASS,COURSEREC,
      DIAGNOSECONTENT,DIAGNOSERANGE) 
      values(MRID1,'z',iccardno,dia_date,admiss_times,MDESCRIPT,
      MHISDESCRIPT,CHECKUP,CHECKASS,COURSEREC,DIAGNOSECONTENT,DIAGNOSERANGE);
      end loop;
       
      CLOSE audit_cursor;--每个语句结束记得加";"号
      

  10.   


    /*
    你这个语句写得真的是漏洞百出了啊
    oracle也有convert函数,但是不是这么用的,如果你想将非字符型数据转换为字符型数据
    那么使用to_char函数就可以了;
    使用select语句给变量赋值:
    select col_name into v_var
    from table_name
    where condition;*/
      

  11.   

    目前还是解决不了2个问题,实在是无奈啊,=会分都给你了1, FETCH audit_cursor INTO        Compilation errors for PROCEDURE SZEMR.OUT_EMR
           Error: PLS-00103: 出现符号 "FETCH"在需要下列之一时:
            constant exception
              <an identifier> <a double-quoted delimited-identifier> table
              LONG_ double ref char time timestamp interval date binary
              national character nchar2,  EXIT WHEN audit_cursor%NOTFOUND;
        
        Line: 53
        Text: FETCH audit_cursor INTO    Error: PLS-00103: 出现符号 "EXIT"在需要下列之一时:
            . ( , % ; limit
        Line: 57
        Text: EXIT WHEN audit_cursor%NOTFOUND;
      

  12.   

    --打开游标
    open audit_cursor;
    loop
      FETCH audit_cursor INTO .... ;--分号结尾
      EXIT WHEN audit_cursor%notfound; --判断取完则退出
      --其它处理语句
    end loop;
    --关闭游标
    close audit_cursor;
      

  13.   

    OPEN audit_cursor;
     loop
      FETCH audit_cursor INTO 
      MRID1,iccardno,dia_date,admiss_times,MDESCRIPT1,MHISDESCRIPT1,
      CHECKUP1,CHECKASS1,COURSEREC1,DIAGNOSECONTENT,DIAGNOSERANGE
        
      EXIT WHEN audit_cursor%NOTFOUND;  
      select convert(varchar(8000),xmlcontent) into MDESCRIPT from xmlfilerecord where xmlcontentid=MDESCRIPT1
      select convert(varchar(8000),xmlcontent) into CHECKUP from xmlfilerecord where xmlcontentid=CHECKUP1
      select convert(varchar(8000),xmlcontent) into CHECKASS from xmlfilerecord where xmlcontentid=CHECKASS1
      select convert(varchar(8000),xmlcontent) into COURSEREC from xmlfilerecord where xmlcontentid=COURSEREC1
      select convert(varchar(8000),xmlcontent) into MHISDESCRIPT from xmlfilerecord where xmlcontentid=MHISDESCRIPT1
      --添加数据时记得数据类型和个数要与表中的字段对齐
      --表的命名不要以 # 开始,将你的表改过,或者重建,前提是不损害你的数据
      insert into #ca_emr(MRID,flag,iccardno,dia_date,admiss_times,MDESCRIPT,MHISDESCRIPT,CHECKUP,CHECKASS,COURSEREC,
      DIAGNOSECONTENT,DIAGNOSERANGE) 
      values(MRID1,'z',iccardno,dia_date,admiss_times,MDESCRIPT,
      MHISDESCRIPT,CHECKUP,CHECKASS,COURSEREC,DIAGNOSECONTENT,DIAGNOSERANGE);
      end loop;  CLOSE audit_cursor
      DEALLOCATE audit_cursor
    Compilation errors for PROCEDURE SZEMR.OUT_EMRError: PLS-00103: 出现符号 "FETCH"在需要下列之一时:
            constant exception
              <an identifier> <a double-quoted delimited-identifier> table
              LONG_ double ref char time timestamp interval date binary
              national character nchar
    Line: 53
    Text: FETCH audit_cursor INTOError: PLS-00103: 出现符号 "EXIT"在需要下列之一时:
            . ( , % ; limit
    Line: 57
    Text: EXIT WHEN audit_cursor%NOTFOUND;
      

  14.   

     OPEN audit_cursor;
     loop
      FETCH audit_cursor INTO 
      MRID1,iccardno,dia_date,admiss_times,MDESCRIPT1,MHISDESCRIPT1,
      CHECKUP1,CHECKASS1,COURSEREC1,DIAGNOSECONTENT,DIAGNOSERANGE;
        
      EXIT WHEN audit_cursor%NOTFOUND;
      
      select convert(varchar(8000),xmlcontent) into MDESCRIPT from xmlfilerecord where xmlcontentid=MDESCRIPT1
      select convert(varchar(8000),xmlcontent) into CHECKUP from xmlfilerecord where xmlcontentid=CHECKUP1  select convert(varchar(8000),xmlcontent) into CHECKASS from xmlfilerecord where xmlcontentid=CHECKASS1
      select convert(varchar(8000),xmlcontent) into COURSEREC from xmlfilerecord where xmlcontentid=COURSEREC1
      select convert(varchar(8000),xmlcontent) into MHISDESCRIPT from xmlfilerecord where xmlcontentid=MHISDESCRIPT1
      --添加数据时记得数据类型和个数要与表中的字段对齐
      --表的命名不要以 # 开始,将你的表改过,或者重建,前提是不损害你的数据
      insert into #ca_emr(MRID,flag,iccardno,dia_date,admiss_times,MDESCRIPT,MHISDESCRIPT,CHECKUP,CHECKASS,COURSEREC,
      DIAGNOSECONTENT,DIAGNOSERANGE) 
      values(MRID1,'z',iccardno,dia_date,admiss_times,MDESCRIPT,
      MHISDESCRIPT,CHECKUP,CHECKASS,COURSEREC,DIAGNOSECONTENT,DIAGNOSERANGE);
      end loop;  CLOSE audit_cursor
      DEALLOCATE audit_cursor
    Compilation errors for PROCEDURE SZEMR.OUT_EMRError: PLS-00103: 出现符号 "FETCH"在需要下列之一时:
            constant exception
              <an identifier> <a double-quoted delimited-identifier> table
              LONG_ double ref char time timestamp interval date binary
              national character nchar
    Line: 53
    Text: FETCH audit_cursor INTOError: PLS-00103: 出现符号 "SELECT"在需要下列之一时:
            . ( * @ % & - + ; / at
              for mod rem <an exponent (**)> and or group having intersect
              minus order start union where connect ||
    Line: 60
    Text: select convert(varchar(8000),xmlcontent) into CHECKUP from xmlfilerecord where xmlcontentid=CHECKUP1