过程功能是每天创建一张新表,表明是A_YYYYMMDD,创建前先检查是否存在本日表,存在就删除。create or replace procedure sp_createtab_tbl_programme Authid Current_User as
  tabname varchar(20);
  str1    varchar(100);
  str2    varchar(100);
  n       nunmber;
begin
  select 'A_' || to_char(sysdate, 'yyyymmdd') into tabname from dual;
  str1 := 'drop table ' || tabname || ' ';
  str2 := 'create table ' || tabname || '  as select * from A where 1 != 1';
select count(*) into n from user_tables where table_name= '||tabname||';
   if n!=0 then
     execute immediate str1;
   endif;
   execute immediate str2;
commit;
end;报错如下:Compilation errors for PROCEDURE SYSTEM.SP_CREATETAB_TBL_PROGRAMMEError: PLS-00103: Encountered the symbol ";" when expecting one of the following:
       
          if
Line: 23
Text: end;请各位帮忙解释,非常感谢。

解决方案 »

  1.   

    create or replace procedure sp_createtab_tbl_programme Authid Current_User as
      tabname varchar(20);
      str1 varchar(100);
      str2 varchar(100);
      n nunmber;
    begin
      select 'A_' || to_char(sysdate, 'yyyymmdd') into tabname from dual;
      str1 := 'drop table ' || tabname || ' ';
      str2 := 'create table ' || tabname || ' as select * from A where 1 != 1';
    select count(*) into n from user_tables where table_name= '||tabname||';
      if n!=0 then
      execute immediate str1;
      else
      execute immediate str2;
      end if;
    commit;
    end;
      

  2.   

    呵呵,这么快就有回复,gelyon真是个热心的mm。我发现问题的原因,竟然是我把END IF 写成了ENDIF。晕死。谢谢gelyon的回复,周末愉快。
      

  3.   

    create or replace procedure sp_createtab_tbl_programme2 Authid Current_User as
      tabname varchar(20);
      str1 varchar(100);
      --str2 varchar(100);
      n int;
    begin
      select 'A_' || to_char(sysdate, 'yyyymmdd') into tabname from dual;
      str1 := 'drop table '||tabname||'';
      --str2 := 'create table ' || tabname || ' as select * from A where 1 != 1';
    select count(*) into n from user_tables where table_name= '||tabname||';
      if n!=0 then
         execute immediate str1;
         commit;
      end if;
    commit;
    end;代码改为如上,发现判断语句没有起作用,不能删除表。请再帮忙看看!!!
      

  4.   

    不能删除表说明你当前用户下没有该表啊!
    你select count(*) into n from user_tables where table_name= '||tabname||';
    查询不到表!
    建议你这样做:
    select count(*) into n from user_tables where table_name= upper('||tabname||')';
      

  5.   

    你到底表A_20100919这个表存在不啊?不存在当然无从去drop了撒
      

  6.   

    应该是  end if;吧。
      

  7.   

    select 'A_' || to_char(sysdate, 'yyyymmdd') into tabname from dual;tabname实际值是“A_20100918”,此表我手工建好了。但是存储过程就是删不掉的。好怪啊。晕啊。我用的是system帐号。
      

  8.   

    我晕!
    你的是A_20100918
    你再查查
    select 'A_' || to_char(sysdate, 'yyyymmdd')  from dual; 
    结果是A_20100919 ,而不是A_20100918
    还有,如果你是system账号登陆的,那么你直接
    select * from user_tables where table_name='A_20100918'; 是否有记录啊?
      

  9.   

    是18还是19,是由系统时间决定的,我的系统时间是20100918,所以生成的表与删除的表都是A_20100918.select 'A_' || to_char(sysdate, 'yyyymmdd') from dual; 
    结果是A_20100918.
    select * from user_tables where table_name='A_20100918';
    有记录。唉,真不知道怎么回事!谢谢你的回复。
      

  10.   

    会不会是你这句话空格问题:
    str1 := 'drop table '||tabname||'';改成试试:str1 := 'drop table '||tabname;
      

  11.   


    --或者这样改试下
    create or replace procedure sp_createtab_tbl_programme2 Authid Current_User as
      tabname varchar(20);
      str1 varchar(100);
      --str2 varchar(100);
      n int;
    begin
      select 'A_' || to_char(sysdate, 'yyyymmdd') into tabname from dual;
      str1 := 'drop table :1';
      --str2 := 'create table ' || tabname || ' as select * from A where 1 != 1';
    select count(*) into n from user_tables where table_name= '||tabname||';
      if n!=0 then
      execute immediate str1 using tabname ;
      commit;
      end if;
    commit;
    end;
      

  12.   

    晕,真是怪了。把条件 if n!=0 then 改为  if n=0 then 就删除成功了。这是怎么回事呢?
      

  13.   


    哦 我知道了!
    查询语句要这样改:select count(*) into n from user_tables where table_name= '''||tabname||''';保证这下OK了
      

  14.   

    呵呵。谢谢gelyon的提醒,应该改为:select count(*) into n from user_tables where table_name= ''||tabname||'';前后各两个引号,三个引号也不行的。
      

  15.   

    select count(*) into n from user_tables where table_name= '||tabname||';
    这句话也要用动态SQL去拼:sql_str:= 'select count(*) from user_tables where table_name='''||tabname||'''';
    execute immediate sql_str into n;
      

  16.   

    呵呵,是啊,谢谢gelyon的回复。
      

  17.   

    mystep 你还到处晃悠, 该结贴了啊!  (*^__^*) 嘻嘻……