分享

浅谈Oracle中大数据量表的管理(2)

 gerial 2011-09-30

自动创建分区实现如下:

  /**************************************************************************

  Program Name:Add_Partition

  Description:

  创建某个用户下个月的所有分区

  ***************************************************************************/

  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;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多