DECLARE
sqltext varchar(500); month varchar(5);
BEGIN
select to_char(to_char((trunc(sysdate, 'mm')- interval '2' month),'mm'), '09') into month  from dual;
sqltext:='truncate table XPrice_SRChannelHis_'||month;
execute immediate sqltext;
END;
/我想在每个月的一号,删除前一个月的数据。考虑到数据量较大,目前系统采用了12张表保留数据,例如表名为XPrice_SRChannelHis_01等,后面的数字代表月份。老写不对,求指导

解决方案 »

  1.   

    DECLARE
      sqltext    VARCHAR2(500);
      tableIndex VARCHAR2(2);
    BEGIN
      IF (TO_CHAR(sysdate,'dd')= '01') THEN
        sqltext               :='truncate table XPrice_SRChannelHis_' || TO_CHAR(sysdate,'mm');
        --execute immediate sqltext;
        dbms_output.put_line (sqltext);
      ELSE
        dbms_output.put_line ('今天【' || TO_CHAR(sysdate,'dd') || '】还不是一号');
      END IF;
    END;--结果
    今天【05】还不是一号
    或者是TRUNCATE TABLE 语句。
      

  2.   

    原来执行sql语句是用dbms_output.put_line (sqltext);而不是execute immediate sqltext;的呀,学习了。
      

  3.   

    dbms_output.put_line (sqltext);  -- 这个是打印sqltext变量
    execute immediate sqltext        --这个是执行sqltext变量保存的语句
      

  4.   

    哎,傻了。我只是点了下,看pl/sql没报错就给分了。1楼的回复根本不是我要的
      

  5.   

    DECLARE
      sqltext VARCHAR2(500);
      tableIndex VARCHAR2(2);
    BEGIN
      IF (TO_CHAR(sysdate,'dd')= '01') THEN
      sqltext :='truncate table XPrice_SRChannelHis_' || TO_CHAR(sysdate,'mm');
      execute immediate sqltext;
      --dbms_output.put_line (sqltext);
      ELSE
      dbms_output.put_line ('今天【' || TO_CHAR(sysdate,'dd') || '】还不是一号');
      END IF;
    END;我只是为了方便查看结果,把本该执行的语法改成输出语法了。
    改过来试试吧。