1

我对 Oracle PL/SQL 数据库应用程序的开发非常陌生……我有一个客户要求,我们为他们创建了一个 ETL,删除了前几天的表。该表是使用同义词创建的,创建表需要时间戳,例如:TEST_TEST_todaysdate

现在他们想更改 ETL 并且不想删除前几天的表,而是想保留三天的数据,并在第四天......该过程应该删除最后几天作为循环,以便表保留最后三天!我希望你们能理解我,但它是这样的 - 从星期一到星期三,星期四然后删除星期一,星期五然后删除星期二,等等。

这是一个代码片段:

   -- check &&1..&&3._&&2
   select count(*)
   into v_exist
   from all_tables
   where owner = upper('&&1')
   and   table_name = upper('&&3._&&2');

   if v_exist > 0 then
      for r in (select owner,table_name
                from all_tables
                where  owner = upper('&&1')
                and    table_name like upper('&&3%')  --- exclude MASTER_* tables
                and    table_name <>  upper('&&3')    --- just for precaution

这是我的代码:

and    table_name = start_day DATE as ((SELECT extract(hour from current_timestamp)) - 4 FROM dual
  --and    table name =' || previous_days_table ||' -- saving previous days table
                and    table_name < upper('&&3._&&2')) loop
          v_sql := 'DROP TABLE ' || r.owner || '.' || r.table_name || ' CASCADE CONSTRAINTS PURGE';
          dbms_output.put_line(v_sql);
          execute immediate v_sql;
      end loop;
   end if;
EXCEPTION
        WHEN OTHERS THEN
                RAISE;
END;
4

1 回答 1

2

有两种方法可以做到这一点; 第一个是基于您自己的日期戳;表创建日期的第二个。

假设您的日期戳格式为 YYYYMMDD,我会执行以下操作:

begin

   for xx in ( select owner, table_name
                 from all_tables
                where regexp_like(table_name, 'TEST_TEST_[[:digit:]]{8}')
                  and to_date(substr(table_name, -8), 'yyyymmdd') < trunc(sysdate) - 4
                  and owner = 'THE_OWNER'
                      ) loop

      execute immediate 'drop table ' ||
                          xx.owner || '.' ||
                          xx.table_name ||
                          ' purge';

   end loop;

end;
/

从本质上讲,这一切都是为了让您的 SQL 语句正确,以便您只在其中包含要删除的表。

或者,您可以使用从 ALL_OBJECTS 创建对象的日期,使您的 SQL 语句如下所示:

select owner, object_name
  from all_objects
 where object_type = 'TABLE'
   and regexp_like(object_name, 'TEST_TEST_[[:digit:]]{8}')
   and trunc(created) < trunc(sysdate) - 4
   and owner = 'THE_OWNER'
       ;

请注意,这样做,尤其是使用 PURGE 关键字时,本质上是危险的。如果可能的话,最好将您的 ETL 更改为将日期作为列加载到单个表中,然后从该表中删除您不再需要的任何数据。这也将消除对动态创建和删除表的需要。

于 2013-07-27T12:37:28.400 回答