自動創(chuàng)建分區(qū)實現(xiàn)如下:
/**************************************************************************
Program Name:Add_Partition
Description:
創(chuàng)建某個用戶下個月的所有分區(qū)
***************************************************************************/
PROCEDURE add_partition (v_schema IN VARCHAR2)
IS
CURSOR c_td_table
IS
SELECT tablename
FROM h_retention
WHERE typeid = 'PARTITION'
AND schemaname = UPPER (v_schema)
ORDER BY tablename;
v_cur BINARY_INTEGER;
v_int BINARY_INTEGER;
v_partition VARCHAR2 (30);
v_date DATE;
v_days NUMBER;
sql_stmt VARCHAR2 (1000); -- String used to save sql statement
err_msg VARCHAR2 (300);
BEGIN
v_date := TRUNC (ADD_MONTHS (SYSDATE, 1), 'MM');
v_days :=
TO_NUMBER (TO_CHAR (LAST_DAY (ADD_MONTHS (SYSDATE, 1)), 'DD'));
v_cur := DBMS_SQL.open_cursor;
FOR v_table IN c_td_table
LOOP
v_date := TRUNC (ADD_MONTHS (SYSDATE, 1), 'MM');
v_partition := v_table.tablename;
FOR i IN 1 .. v_days
LOOP
BEGIN
sql_stmt :=
'ALTER TABLE '
|| v_schema
|| '.'
|| v_table.tablename
|| ' ADD PARTITION '
|| v_partition
|| '_'
|| TO_CHAR (v_date, 'YYMMDD')
|| ' '
|| 'VALUES LESS THAN (TO_DATE('''
|| TO_CHAR (v_date + 1, 'YYYY-MM-DD')
|| ''',''YYYY-MM-DD'')) ';
DBMS_SQL.parse (v_cur, sql_stmt, DBMS_SQL.native);
v_int := DBMS_SQL.EXECUTE (v_cur);
EXCEPTION
WHEN OTHERS
THEN
err_msg :=
v_partition
|| ': Create '
|| TO_CHAR (v_date, 'YYMMDD')
|| ' partition unsuccessfully! Error Information:'
|| SQLERRM;
log_insert (err_msg); --You can define your own log_insert function
COMMIT;
END;
v_date := v_date + 1;
END LOOP;
END LOOP;
DBMS_SQL.close_cursor (v_cur);
END;