oracle 数据库
每天会形成一张表,如:table20101221;后面日期是变动的。
我需要写个批处理每天定时删除前一天的表,如:table20101220;那位高手给写个。
要求使用sqlplus或批处理、本人使用sqlplus写了个,但只是生成sql语句。:
select 'Drop Table ' || 'table'||to_char(sysdate-1,'YYYYMMDD')||';' From Dual;执行后,输出一条sql语句。
Drop Table table20101220;
本人想直接删除。

解决方案 »

  1.   


    begin
       execute immediate  'Drop Table ' || 'table'||to_char(sysdate-1,'YYYYMMDD');
       commit;
    end;
      

  2.   

    declare
    jobno number;
    begin
    dbms_job.submit(jobno, 'begin execute immediate 'drop table test'||to_char(sysdate,
    'YYYYMMDD');end;' ,sysdate , 'trunc(sysdate+1)+1/24);
    commit;
    end;
    我把这个生成个.bat文件,不能执行?
      

  3.   

    作业是自动运行的不需要你生成bat文件
      

  4.   

    create or replace procedure drop_tb_proc
    IS
     v_tb varchar2(30);
     v_sql VARCHAR2(200);
     v_cnt NUMBER(4,0);
    BEGIN
      SELECT 'table'||to_char(sysdate-1,'yyyymmdd') into v_tb from dual;  
      -- 也许:table要大写(TABLE),看你是怎么命名的啦!
      EXECUTE IMMEDIATE 'SELECT count(1) into v_cnt from user_tables where table_name=:v_tb'
      INTO v_cnt USING v_tb;
      IF v_cnt=1 THEN
       EXECUTE IMMEDIATE 'DROP TABLE '||v_tb;
      END IF;
    END;
    /
      

  5.   


     创建一个自定义过程
      SQL> create or replace procedure MYPROC as
       2 begin
       3 execute immediate  'Drop Table ' || 'table'||to_char(sysdate-1,'YYYYMMDD');
       4 end;
       5 /
      
      过程已创建。
      
      创建JOB
      SQL> variable job1 number;
      SQL> 
      SQL> begin
       2 dbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440');  --每天1440分钟,即一分钟运行test过程一次
       3 end;
       4 /
      
      PL/SQL 过程已成功完成。
      

  6.   


    创建一个自定义过程
      SQL> create or replace procedure MYPROC as
       2 begin
       3 execute immediate  'Drop Table ' || 'table'||to_char(sysdate-1,'YYYYMMDD');
       4 end;
       5 /
      
      过程已创建。
      
      创建JOB
      SQL> variable job1 number;
      SQL> 
      SQL> begin
       2 dbms_job.submit(:job1,'MYPROC;',sysdate,'trunc(sysdate+1)+1/24');  --改下时间,每天凌晨一点运行
       3 end;
       4 /
      
      PL/SQL 过程已成功完成。
      

  7.   

    eygle@SZTYORA> create table table20101221(id number(18,0),name varchar2(30));表已创建。eygle@SZTYORA> create or replace procedure drop_tb_proc
      2  IS
      3   v_tb varchar2(30);
      4   v_sql VARCHAR2(200);
      5   v_cnt NUMBER(4,0);
      6  BEGIN
      7    SELECT 'TABLE'||to_char(sysdate-1,'yyyymmdd') into v_tb from dual;
      8    -- 也许:table要大写(TABLE)
      9    EXECUTE IMMEDIATE 'SELECT count(1) from user_tables where table_name=:v_tb' into v_cnt using v_tb;
     10    IF v_cnt=1 THEN
     11     EXECUTE IMMEDIATE 'DROP TABLE '||v_tb;
     12    END IF;
     13  END;
     14  /过程已创建。eygle@SZTYORA> desc table20101221;
     名称                                                                                      是否为空? 类型
     ----------------------------------------------------------------------------------------- -------- -----------------------------------------------------------
     ID                                                                                                 NUMBER(18)
     NAME                                                                                               VARCHAR2(30)eygle@SZTYORA> exec  drop_tb_proc;PL/SQL 过程已成功完成。eygle@SZTYORA> desc table20101221;
    ERROR:
    ORA-04043: 对象 table20101221 不存在
    eygle@SZTYORA>
      

  8.   

    -- 在执行 drop 操作之前,先判断一下要删除的表是否存在!
      

  9.   

    rem 用户名
    set username=scott
    rem 密码
    set passwd=tigerrem 设置连接串tnsname
    set tnsname=ctlrem 取年月日
    set y=%date:~0,4%
    set m=%date:~5,2%
    set d=%date:~8,2%echo drop table table_name%y%%m%%d%;  > script.sqlrem 删除表
    sqlplus %username%/%passwd%@%tnsname% @script.sql 将这些东西copy到一个bat文件中,修改相关的参数 就可以运行了
      

  10.   

    注意set与 "=" 以及"=" 与 变量值后面都不能有空格