我們的資料庫中的好幾張表,每天一個磁區,但我們需要按日期清除資料,現在用“alter table 表名 truncate partition 磁區號 update indexes”陳述句手動清除,很煩,要去查所需日期的磁區號,寫進去,再逐條執行。有沒有大神能幫助撰寫只需表名稱和洗掉日期,就直接按磁區號清除資料的陳述句,非常感謝!!!
簡化來說就是,只輸入要清除表名、起止日期,即可執行“alter table 表名 truncate partition 磁區號 update indexes”陳述句,就行了,不需要每張表去找磁區號,非常感謝大神幫忙!!
uj5u.com熱心網友回復:
把你做的封裝成procedureuj5u.com熱心網友回復:
可以試下 定義一個job,定時執行洗掉的procedureuj5u.com熱心網友回復:
但是怎么才能才到需要洗掉日期的磁區號呢,從view里查很慢uj5u.com熱心網友回復:
由于樓主沒給出磁區名稱的命名規范。這里假設為: P+yyyymmdd,如:P20171225新建一個存盤程序,代碼請自行測驗。
create or replace procedure p_partition_truncate
(
table_name in varchar2, --表名稱
dtime in varchar2 --起始日期
)
is
v_sql varchar2(1000);
begin
v_sql := 'alter table '||table_name||' truncate partition '||'P'||dtime||' update indexes';
exception
when others then
raise;
end;
uj5u.com熱心網友回復:
存盤程序修改下:
create or replace procedure p_partition_truncate
(
table_name in varchar2, --表名稱
dtime in varchar2 --起始日期
)
is
v_sql varchar2(1000);
begin
v_sql := 'alter table '||table_name||' truncate partition '||'P'||dtime||' update indexes';
execute immediate v_sql;
exception
when others then
raise;
end;
uj5u.com熱心網友回復:
這個任務做比較合適,這個存盤程序,shell呼叫執行uj5u.com熱心網友回復:
dba_tab_partitionsuj5u.com熱心網友回復:
CREATE OR REPLACE PROCEDURE P_PARTITION_TRUNCATE
(
TABLE_NAME IN VARCHAR2, --表名稱
DTIME IN VARCHAR2, --起始日期
TIME_COL_NAME IN VARCHAR2 --日期列名稱
) IS
V_SQL VARCHAR2(1000);
V_ROWID ROWID;
V_SUBOBJECT_NAME USER_OBJECTS.SUBOBJECT_NAME%TYPE;
BEGIN
V_SQL := 'select max(rowid) from ' || TABLE_NAME || ' where ' ||
TIME_COL_NAME || '=''' || DTIME || '''';
EXECUTE IMMEDIATE V_SQL
INTO V_ROWID;
SELECT MAX(SUBOBJECT_NAME)
INTO V_SUBOBJECT_NAME
FROM USER_OBJECTS T
WHERE T.DATA_OBJECT_ID IN (SELECT DBMS_ROWID.ROWID_OBJECT(V_ROWID)
FROM DUAL);
V_SQL := 'alter table ' || TABLE_NAME || ' truncate partition ' ||
V_SUBOBJECT_NAME || ' update indexes';
--DBMS_OUTPUT.PUT_LINE(V_SQL);
EXECUTE IMMEDIATE V_SQL;
EXCEPTION
WHEN OTHERS THEN
RAISE;
END;
不知道磁區名的情況下,可以通過rowid來確認所屬磁區的, 代碼用的日期是字串型的, 如果是其他型別,稍微修改一下即可
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/76464.html
標籤:基礎和管理
下一篇:oracle基礎知識分享
