怎么样用创建一个oracle存储过程来删除一个时间段创建的表

2025-03-22 09:03:58
推荐回答(3个)
回答1:

create or replace PROCEDURE sp_droptable
(v_begintime in varchar2,
v_endtime in varchar2)
as
v_tablename varchar2(256);
cursor cur_tablename is
select object_name from user_objects where object_type='TABLE' and to_char(CREATED,'yyyy-mm-dd')
between v_begintime
and v_endtime order by CREATED desc;
begin
open cur_tablename;
loop
fetch cur_tablename into v_tablename;
exit when cur_tablename%notfound;
execute immediate 'drop table '||v_tablename||'';
end loop;
close cur_tablename;
end sp_droptable;

楼上的可能差不多,但忽略了一个问题,就是存在主外键关系的时候,要先删除从表,才能删除主表,所以这个要按照时间排个倒叙才行,这样执行的时候才不会报错

输入的时间格式为2013-04-01 这样的格式

楼上那哥们,你的我执行了一下,不报错,但是最后没删除掉表,我想,可能是因为
and created > to_date(begin_time,'yyyy-mm-dd')
and created < to_date(end_time,'yyyy-mm-dd');

地方造成的,之前我也这么写的也有问题
改成to_char(created ,'yyyy-mm-dd') >beging_time这样就好使了

回答2:

查询当前用户的表名,和创建时间:
SELECT OBJECT_NAME, CREATED FROM USER_OBJECTS WHERE OBJECT_NAME IN(select TABLE_NAME from user_tables);

按照你想删除的时间段,删除就是了。

回答3:

create or replace procedure drop_table_by_time(begin_time in varchar2,
end_time in varchar2) is
cursor cur_tables is
select object_name
from user_objects
where object_type = 'TABLE'
and created > to_date(begin_time,'yyyy-mm-dd')
and created < to_date(end_time,'yyyy-mm-dd');
v_sql varchar2(1000);
begin
for rec_tables in cur_tables loop
v_sql:= 'drop table ' || rec_tables.object_name || ';';
execute immediate v_sql;
end loop;
end drop_table_by_time;