Error: PLS-00103: 出现符号 "DECLARE"在需要下列之一时:
        begin end function
          package pragma procedure subtype type use <an identifier>
          <a double-quoted delimited-identifier> form current cursor
Line: 3
Text: DEClAREpl/sql中写了一个小的存储过程总是报错,请高人指点
procedure addCrewBoard1(v_tsk in varchar2, v_userId in varchar2, v_userName in varchar2, v_content in varchar2)is
  v_id int;  
  begin
    select crewboardseq.nextval into v_id from dual;
    insert into epare_crewboard(id, tsk, userid, username, content)
     values(v_id, v_tsk, v_userId, v_userName, v_content);
    
    /**开始向数据表epare_crewISVIEW加记录*/
    DEClARE
  
    CURSOR receiver(tskID VARCHAR2) IS SELECT epc.username FROM epare_crewschedule epc where epc.tsk=tskID    
    v_tmpname epc.username%TYPE;
    
    begin
    
    FOR r_tmp IN receiver(v_tsk) LOOP  /**DBMS_OUTPUT.PUT_LINE('Name:' || v_ename || 'salary:' || v_salary);*/    if(v_tmpname=v_userName) then 
    {
       insert into epare_crewisview(CREWBOARDID, TSK, SENDERNAME, RECEIVERNAME, ISVIEW)
       values(v_id, v_tsk, v_userName, username,1);
    }
    else
    {
       insert into epare_crewisview(CREWBOARDID, TSK, SENDERNAME, RECEIVERNAME, ISVIEW)
       values(v_id, v_tsk, v_userName, username,0);
    }                            
   end if;    END LOOP;
    
    end;
     
  end;  

解决方案 »

  1.   


    定义变量要放到开始的位置:
    PROCEDURE ADDCREWBOARD1(V_TSK      IN VARCHAR2,
                            V_USERID   IN VARCHAR2,
                            V_USERNAME IN VARCHAR2,
                            V_CONTENT  IN VARCHAR2) IS
      /**开始向数据表epare_crewISVIEW加记录*/
      CURSOR RECEIVER(TSKID VARCHAR2) IS
        SELECT EPC.USERNAME FROM EPARE_CREWSCHEDULE EPC WHERE EPC.TSK = TSKID;
      V_TMPNAME EPC.USERNAME%TYPE;
      V_ID      INT;
    BEGIN
      SELECT CREWBOARDSEQ.NEXTVAL INTO V_ID FROM DUAL;
      INSERT INTO EPARE_CREWBOARD
        (ID, TSK, USERID, USERNAME, CONTENT)
      VALUES
        (V_ID, V_TSK, V_USERID, V_USERNAME, V_CONTENT);END;
    /
      

  2.   


    怎么还有java的语法
    {
      //
    }在里面  procedure addCrewBoard1(v_tsk in varchar2, v_userId in varchar2, v_userName in varchar2, v_content in varchar2)
      is 
      v_id int;  
      v_tmpname epc.username%TYPE;   
      begin 
        select crewboardseq.nextval into v_id from dual; 
        insert into epare_crewboard(id, tsk, userid, username, content) 
        values(v_id, v_tsk, v_userId, v_userName, v_content); 
       
        FOR r_tmp IN (SELECT epc.username FROM epare_crewschedule epc where epc.tsk=v_tsk) 
        LOOP 
          if(r_tmp.v_tmpname=v_userName) then 
            insert into epare_crewisview(CREWBOARDID, TSK, SENDERNAME, RECEIVERNAME, ISVIEW) 
            values(v_id, v_tsk, v_userName, r_tmp.username,1); 
          else 
            insert into epare_crewisview(CREWBOARDID, TSK, SENDERNAME, RECEIVERNAME, ISVIEW) 
            values(v_id, v_tsk, v_userName, r_tmpusername,0);                            
         end if; 
        END LOOP; 
     End; 
     /
      

  3.   

    试试这个:
    procedure addCrewBoard1(v_tsk in varchar2, v_userId in varchar2, v_userName in varchar2, v_content in varchar2)is 
      v_id int;  
      v_tmpname epc.username%TYPE;  
        /**开始向数据表epare_crewISVIEW加记录*/ 
      CURSOR receiver(tskID VARCHAR2) IS SELECT epc.username FROM epare_crewschedule epc where epc.tsk=tskID;
        
    begin 
        select crewboardseq.nextval into v_id from dual; 
        insert into epare_crewboard(id, tsk, userid, username, content) 
        values(v_id, v_tsk, v_userId, v_userName, v_content); 
        
        FOR r_tmp IN receiver(v_tsk) LOOP   /**DBMS_OUTPUT.PUT_LINE('Name:' ¦ ¦ v_ename ¦ ¦ 'salary:' ¦ ¦ v_salary);*/      if v_tmpname=v_userName  then 
         insert into epare_crewisview(CREWBOARDID, TSK, SENDERNAME, RECEIVERNAME, ISVIEW) 
          values(v_id, v_tsk, v_userName, username,1); 
        else 
          insert into epare_crewisview(CREWBOARDID, TSK, SENDERNAME, RECEIVERNAME, ISVIEW) 
          values(v_id, v_tsk, v_userName, username,0);                           
       end if;     END LOOP; 
        
    end; 
      

  4.   

    我现在重新做了一个包,然后写成这样
    DEClARE
        CURSOR receiver(tskID VARCHAR2) IS SELECT epc.username FROM epare_crewschedule epc where epc.tsk=tskID;
        v_tmpname epc.username%TYPE;
    create or replace package body MYPPEPARENEW is
    /**根据需求进行修改机组人员的留言信息2008-08-28**/
      procedure addCrewBoard1(v_tsk in varchar2, v_userId in varchar2, v_userName in varchar2, v_content in varchar2)
      is          
      v_id int;    
      begin 
        select crewboardseq.nextval into v_id from dual; 
        insert into epare_crewboard(id, tsk, userid, username, content) 
        values(v_id, v_tsk, v_userId, v_userName, v_content); 
           
        /**开始向数据表epare_crewISVIEW加记录*/    
        FOR r_tmp IN receiver(v_tsk) LOOP  /**DBMS_OUTPUT.PUT_LINE('Name:' || v_ename || 'salary:' || v_salary);*/    if(v_tmpname=v_userName) then 
        
           insert into epare_crewisview(CREWBOARDID, TSK, SENDERNAME, RECEIVERNAME, ISVIEW)
           values(v_id, v_tsk, v_userName, username,1);
        
        else
        
           insert into epare_crewisview(CREWBOARDID, TSK, SENDERNAME, RECEIVERNAME, ISVIEW)
           values(v_id, v_tsk, v_userName, username,0);
                                    
       end if;    END LOOP;
       
      end; 
      
    end MYPPEPARENEW;
    结果还是报
    Compilation errors for PACKAGE BODY EPAREBJ.MYPPEPARENEWError: PLS-00103: 出现符号 ""在需要下列之一时:
            begin case declare exit for
              goto if loop mod null pragma raise return select update while
              with <an identifier> <a double-quoted delimited-identifier>
              <a bind variable> << close current delete fetch lock insert
              open rollback savepoint set sql execute commit forall merge
              <a single-quoted SQL string> pipe
    Line: 17
      

  5.   

    mantisXF,按你的方式,还是不行报的是
    Compilation errors for PACKAGE BODY EPAREBJ.MYPPEPARENEWError: PLS-00103: 出现符号 ""在需要下列之一时:
            begin case declare end exit
              for goto if loop mod null pragma raise return select update
              while with <an identifier>
              <a double-quoted delimited-identifier> <a bind variable> <<
              close current delete fetch lock insert open rollback
              savepoint set sql execute commit forall merge
              <a single-quoted SQL string> pipe
           符号 "" 被忽略。
    Line: 31
      

  6.   


    CREATE OR REPLACE procedure addCrewBoard1(v_tsk in varchar2, v_userId in varchar2, v_userName in varchar2, v_content in varchar2)is 
      v_id int;  
      v_tmpname epare_crewschedule.username%TYPE;  
        /**开始向数据表epare_crewISVIEW加记录*/ 
      CURSOR receiver(tskID VARCHAR2) IS SELECT epc.username FROM epare_crewschedule epc where epc.tsk=tskID;
        
    begin 
        select seq.nextval into v_id from dual; 
        insert into epare_crewboard(id, tsk, userid, username, content) 
        values(v_id, v_tsk, v_userId, v_userName, v_content); 
        
        FOR r_tmp IN receiver(v_tsk) LOOP   /**DBMS_OUTPUT.PUT_LINE('Name:' ?? ?? v_ename ?? ?? 'salary:' ?? ?? v_salary);*/      if v_tmpname=v_userName  then 
         insert into epare_crewisview(CREWBOARDID, TSK, SENDERNAME, RECEIVERNAME, ISVIEW) 
          values(v_id, v_tsk, v_userName, v_userName,1); 
        else 
          insert into epare_crewisview(CREWBOARDID, TSK, SENDERNAME, RECEIVERNAME, ISVIEW) 
          values(v_id, v_tsk, v_userName, v_username,0);                           
       end if;     END LOOP; 
        
    end;
    /
    试试这个。
      

  7.   

    allanmorgan,这个也是不行的,上面的一位仁兄也是写得这个,我现在试了一个新的,贼简单的DEClARE  
        v_tmpname epc.username%TYPE
        CURSOR receiver(tskID VARCHAR2) IS SELECT epc.username FROM epare_crewschedule epc where epc.tsk=tskID;
    create or replace package body MYPREPARENEW is         
      procedure addCrewBoard1(v_tsk in varchar2, v_userId in varchar2, v_userName in varchar2, v_content in varchar2)
      is            
      v_id int;    
      begin 
        select crewboardseq.nextval into v_id from dual; 
        insert into epare_crewboard(id, tsk, userid, username, content) 
        values(v_id, v_tsk, v_userId, v_userName, v_content);   
      end; 
    end MYPREPARENEW;
    这样编译就没问题,可是如果
    DEClARE  
        v_tmpname epc.username%TYPE
        CURSOR receiver(tskID VARCHAR2) IS SELECT epc.username FROM epare_crewschedule epc where epc.tsk=tskID;
    create or replace package body MYPREPARENEW is         
      procedure addCrewBoard1(v_tsk in varchar2, v_userId in varchar2, v_userName in varchar2, v_content in varchar2)
      is            
      v_id int;    
      begin 
        select crewboardseq.nextval into v_id from dual; 
        insert into epare_crewboard(id, tsk, userid, username, content) 
        values(v_id, v_tsk, v_userId, v_userName, v_content);   
        /**开始向数据表epare_crewISVIEW加记录*/    
        FOR r_tmp IN receiver(v_tsk) LOOP
        end loop;  
      end; 
    end MYPREPARENEW;
    就是加了两行    
    FOR r_tmp IN receiver(v_tsk) LOOP
    end loop; 
    编译就通不过了,报
    Compilation errors for PACKAGE BODY EPAREBJ.MYPREPARENEWError: PLS-00103: 出现符号 "END"在需要下列之一时:
            begin case declare exit for
              goto if loop mod null pragma raise return select update while
              with <an identifier> <a double-quoted delimited-identifier>
              <a bind variable> << close current delete fetch lock insert
              open rollback savepoint set sql execute commit forall merge
              <a single-quoted SQL string> pipe
    Line: 14
    实在是不清楚这是为什么了?
      

  8.   

    好像是解决了现在把代码贴出来大家看看
    create or replace package body MYPREPARENEW is
      procedure addCrewBoard1(v_tsk in varchar2, v_userId in varchar2, v_userName in varchar2, v_content in varchar2)
      is
      CURSOR receiver(tskID VARCHAR2) IS SELECT epc.username FROM epare_crewschedule epc where epc.tsk=tskID;
      v_tmpname varchar2(80);            
      v_id int;  
      begin 
        select crewboardseq.nextval into v_id from dual; 
        insert into epare_crewboard(id, tsk, userid, username, content) values(v_id, v_tsk, v_userId, v_userName, v_content); 
        
        begin
        open receiver(v_tsk);
        LOOP
        fetch receiver into v_tmpname;
        if(v_tmpname=v_userName)then
          insert into epare_crewisview(CREWBOARDID, TSK, SENDERNAME, RECEIVERNAME, ISVIEW)
           values(v_id, v_tsk, v_userName, v_tmpname,1);
        else
           insert into epare_crewisview(CREWBOARDID, TSK, SENDERNAME, RECEIVERNAME, ISVIEW)
           values(v_id, v_tsk, v_userName, v_tmpname,0);     
        end if;
        exit when receiver%notfound;
        end loop;
        close receiver;
        end;
      end; 
    end MYPREPARENEW;
    不知道为什么用for循环就不行,我现结贴,大家要是有什么补充请赐教,入门新手感激仁兄们的帮助!
      

  9.   

    DECLEAR拼写错 DEClARE