alter table使用oracle g11过程添加分区

时间:2015-02-27 13:10:17

标签: oracle stored-procedures plsql database-partitioning

  1. 我正在尝试使用将于每年1月1日运行的过程在分区表上按月添加分区。

    create or replace procedure create_partitions as
      part VARCHAR2(50);
      date_val DATE;
      sql_val VARCHAR2(4000);
    begin
      date_val := TO_DATE(CONCAT(extract(year from sysdate),'-06-01 00:00:00'),'SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN');
      part := CONCAT('P_MAY',extract(year from sysdate));
      sql_val := 'ALTER TABLE TEST1 
        ADD PARTITION '||part||' VALUES LESS THAN ('||date_val||')
        SEGMENT CREATION IMMEDIATE';
    
    EXECUTE IMMEDIATE sql_val;
    end create_partitions;
    
  2. 当我运行此程序时,我收到此错误

      

    ORA-00907:缺少右括号

    而不是连接我尝试使用绑定值

    sql_val := 'ALTER TABLE TEST1 
        ADD PARTITION :1 VALUES LESS THAN (:2)
        SEGMENT CREATION IMMEDIATE';
    
    EXECUTE IMMEDIATE sql_val USING part, date_val;
    

    我得到了这个

      

    ORA-00902:数据类型无效

    如果我尝试使用硬编码值,它可以正常工作。但我需要一些动态的东西。

    1. 还有一种方法可以在G11中添加多个分区,而无需运行多个alter query吗?我尝试过这个,但我认为它仅适用于G12 +

      ALTER TABLE TEST1 ADD
        PARTITION t1...
        PARTITION t2...
      
    2. 由于

2 个答案:

答案 0 :(得分:1)

您需要将日期值转换为日期文字,如下所示:

date_val := TO_DATE(CONCAT(extract(year from sysdate),'-06-01 00:00:00'),'SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN');
date_str := 'DATE'''||to_char(date_val, 'yyyy-mm-dd')||'''';
part := CONCAT('P_MAY',extract(year from sysdate));
  sql_val := 'ALTER TABLE TEST1 
    ADD PARTITION '||part||' VALUES LESS THAN ('||date_str||')
    SEGMENT CREATION IMMEDIATE';

EXECUTE IMMEDIATE sql_val;

或者,如果您需要时间组件(但我在您的示例中看不到您),请执行以下操作:

date_str := 'TO_DATE('''||to_char(date_val, 'yyyy-mm-dd hh24:mi:ss')||''', ''yyyy-mm-dd hh24:mi:ss'')';

我还建议从http://www.softcraftltd.co.uk/downloads/

下载PL / SQL实用程序包

答案 1 :(得分:0)

这就是你的seq应该如何:

sql_val := 'ALTER TABLE TEST1 
    ADD PARTITION '||' '||part|| ' ' ||' VALUES LESS THAN ('||date_str||')
    SEGMENT CREATION IMMEDIATE';

您需要一个空白区域,分区名称为