创建分区

时间:2017-11-13 10:59:12

标签: oracle plsql

嘿,我在使用PL / SQL程序创建分区时遇到问题:

  

ORA-14019:分区绑定元素必须是以下之一:string,datetime或   interval literal,number或MAXVALUE

似乎问题是属性r.partition_date的格式,我已经运行了一些测试脚本并尝试了不同的日期格式,但没有任何帮助。

列partition_date的格式:2017-09-01

我正在运行此程序:

    declare 
v_new_part varchar2(30); 
v_prev_part varchar2(30); 
v_sql varchar2(4000); 
v_table varchar(30) := 'RL2_OUTDW_CORP_PRISK_REV_B'; 
begin 
for r in (select distinct a.partition_date , a.partition_name from XX a 
where a.PARTITION_NAME =  'PARTITION_20170831' 
order by 1) 
loop             
      v_sql := 'alter table ' || v_table || ' SPLIT PARTITION 
      PARTITION_30000101 
      at (''N'',to_date(' || r.partition_date || ',''yyyy.mm.dd'')) 
      into (partition ' || r.partition_name || ' ,partition 
      PARTITION_30000101)';     

 execute immediate v_sql; 
end loop; 
end; 
/

即使这个有效:

 declare 
v_new_part varchar2(30); 
v_prev_part varchar2(30); 
v_sql varchar2(4000); 
v_table varchar(30) := 'RL2_OUTDW_CORP_PRISK_REV_B'; 
begin 
for r in (select distinct a.partition_date , a.partition_name from XX a 
where rownum = '1' 
order by 1) 
loop             
      v_sql := 'alter table ' || v_table || ' SPLIT PARTITION 
      PARTITION_30000101 
      at ("N",to_date(''2017-01-29'',''yyyy.mm.dd'')) 
      into (partition ' || 'PARTITION_20170129' || ' ,partition 
      PARTITION_30000101)';     

 execute immediate v_sql; 
end loop; 
end; 
/ 

感谢您的建议。

2 个答案:

答案 0 :(得分:0)

首先删除此

中的星号

(''N'',to_date(' || **r.partition_date** || ',''yyyy.mm.dd''))第一句话的一部分。

并在光标中格式化

  

for r in(select distinct to_char(a.partition_date,'yyyy.mm.dd')   par_date,a.partition_name来自XX a,其中rownum =' 1'订购1)

并添加两个引号:

  

('' N'',to_date(' '' || r.par_date || ''',& #39;'为yyyy.mm.dd''))

  SQL>set serveroutput on;
  SQL> declare 
    v_new_part varchar2(30); 
    v_prev_part varchar2(30); 
    v_sql varchar2(4000); 
    v_table varchar(30) := 'RL2_OUTDW_CORP_PRISK_REV_B'; 
    begin 
    for r in (select distinct to_char(a.partition_date,'yyyy.mm.dd') par_date , a.partition_name from XX a 
    where a.PARTITION_NAME =  'PARTITION_20170831' 
    order by 1) 
    loop             
          v_sql := 'alter table ' || v_table || ' SPLIT PARTITION 
          PARTITION_30000101 
          at (''N'',to_date('''|| r.par_date || ''',''yyyy.mm.dd'')) 
          into (partition ' || r.partition_name || ' ,partition 
          PARTITION_30000101)';         
      dbms_output.put_line(v_sql); 
      execute immediate v_sql; 
    end loop; 
 end;
 /

答案 1 :(得分:0)

我不明白"N"的目的,但我认为应该是这样:

v_sql := 'alter table ' || v_table || ' SPLIT PARTITION 
  PARTITION_30000101 
  at (DATE '''||TO_CHAR(r.partition_date,'yyyy-mm-dd')||''') 
  into (partition ' || r.partition_name || ' ,partition 
  PARTITION_30000101)';     

注意,当您使用DATE字面值时,格式固定为YYYY-MM-DD,否则请使用

at (TO_DATE('''|| TO_CHAR(r.partition_date,'dd.mm.yyyy') ||''', ''dd.mm.yyyy'')`