create or replace procedure CULTUREQUERY  AS  sID VARCHAR2(20);
  iID number(4);
  sCol VARCHAR2(20);
  sAreaCode VARCHAR2(20);
  createSQL VARCHAR2(2000);
  insertSQL VARCHAR2(2000);
  strSQL VARCHAR2(2000);  CURSOR CV_B_Culture IS Select iID,sID from B_Culture Order by sid;
  begin
  createSQL :=' sAreaCode Varchar2(64) ,sAreaName Varchar2(128),nSum Varchar2(64),';
  insertSQL := ' sAreaCode,sAreaName,nSum,';
    BEGIN
  OPEN CV_B_Culture;
  LOOP
    FETCH CV_B_Culture
      INTO iID,sID;
    EXIT WHEN CV_B_Culture%NOTFOUND;
    createSQL := createSQL || 'L' || sID || ' Varchar(64),';
    insertSQL := insertSQL || 'L' || sID || ',';  END LOOP;
  CLOSE CV_B_Culture;
  if length(createSQL) >0 then
     createSQL := SUBSTR(createSQL,1,length(createSQL)-1);
     insertSQL := SUBSTR(insertSQL,1,length(insertSQL)-1);
  end if;
  select count(1) into num from  user_tables where table_name= 'M_CULTUREQUERY';
  if  num> 0  then
    execute immediate  'drop table  M_CULTUREQUERY';
  end if;  execute immediate  'create table M_CULTUREQUERY ('''|| createSQL ||''')';  execute immediate  'Insert into M_CULTUREQUERY (sAreaCode,sAreaName) select sID,sName from B_Area Where bLeaf<>0 ';  declare
  Cursor CV_B_Area IS select sAreaCode From M_CULTUREQUERY Order By sAreaCode;
  Begin
  Open CV_B_Area;
  loop
       Fetch CV_B_Area Into sAreaCode;
       Exit when cv_B_Area%notfound;
       OPEN CV_B_Culture;
       LOOP
          FETCH CV_B_Culture INTO iID,sID;
          EXIT WHEN CV_B_Culture%NOTFOUND;
          if iid=1 then
             --strsql:='Update M_CULTUREQUERY set nSum=nSum+(select count(1) from ev_M_Base Where sArea like ''|| sAreaCode || '%'' and (istate<> 4 and istate<>-2 and istate<>6) and iLearn <= 1,'|| sCol || '= (select count(1) from ev_M_Base Where sArea like '' || sAreaCode || '%'' and (istate<> 4 and istate<>-2 and istate<>6) and iLearn <= 1)'
             strSQL :='Update M_CULTUREQUERY set nSum=nSum+(select count(1) from ev_M_Base Where sArea like ''|| sAreaCode || '%'' and (istate<> 4 and istate<>-2 and istate<>6) and iLearn <= 1),'|| sCol ||'= (select count(1) from ev_M_Base Where sArea like '' || sAreaCode || '%'' and (istate<> 4 and istate<>-2 and istate<>6) and iLearn <= 1) where sAreaCode ='''|| sAreaCode ||'''';
          else
             strSQL :='Update M_CULTUREQUERY set nSum=nSum+(select count(1) from ev_M_Base Where sArea like ''|| sAreaCode || '%'' and (istate<> 4 and istate<>-2 and istate<>6) and iLearn ='|| iID || '),'|| sCol || '= (select count(1) from ev_M_Base Where sArea like '' || sAreaCode || '%'' and (istate<> 4 and istate<>-2 and istate<>6) and iLearn ='|| iID || ') where sAreaCode =''|| sAreaCode ||''';
          end if;
          execute immediate strSQL ;
       END LOOP;
       CLOSE CV_B_Culture;
  end loop;
  close cv_b_area;
  end;
END;
end;
strSQL :='Update M_CULTUREQUERY set nSum=nSum+(select count(1) from ev_M_Base Where sArea like ''|| sAreaCode || '%'' and (istate<> 4 and istate<>-2 and istate<>6) and iLearn <= 1),'|| sCol ||'= (select count(1) from ev_M_Base Where sArea like '' || sAreaCode || '%'' and (istate<> 4 and istate<>-2 and istate<>6) and iLearn <= 1) where sAreaCode ='''|| sAreaCode ||''''; 
编译时,此句有错,急

解决方案 »

  1.   

    ''|| sAreaCode || '%'' 
    '|| sCol ||'
    '''|| sAreaCode ||''''
    这个的处理好像不对吧
      

  2.   

    如果sAreaCode 是字符型的 那你''|| sAreaCode || '%'' 就不对
    如果数字型的'''|| sAreaCode ||'''' 就不对
    '|| sCol ||' 这个不敢确定
      

  3.   

    like '''|| sAreaCode || '%''like ''' || sAreaCode || '%''
      

  4.   

    编译错误应该在这里:
    strSQL :='Update M_CULTUREQUERY set nSum=nSum+(select count(1) from ev_M_Base Where sArea like '''|| sAreaCode || '%'' and (istate 
    如果执行有错误,可以将strsql先拼好输出检查一遍
      

  5.   

    谢谢  
    wildwave!!!!!!!!!!!!!!!!!
    问题已解决!jietie