alter table 使用过程 oracle g11 添加分区
alter table add partition using a procedure oracle g11
我正在尝试使用每年 1 月 1 日 运行 的过程在分区 table 上按月添加分区。
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;
当我 运行 这个程序时我得到这个错误
ORA-00907: missing right parenthesis
我尝试使用绑定值而不是连接
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: invalid datatype
如果我尝试使用硬编码值,它可以正常工作。但我需要一些动态的东西。
还有一种方法可以在 G11 中添加多个分区,而无需 运行 多个 alter 查询?我试过了,但我认为它只适用于 G12+
ALTER TABLE TEST1 ADD
PARTITION t1...
PARTITION t2...
谢谢
您需要像这样将日期值转换为日期文字:
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'')';
下载 PL/SQL 实用程序包
你的序列应该是这样的:
sql_val := 'ALTER TABLE TEST1
ADD PARTITION '||' '||part|| ' ' ||' VALUES LESS THAN ('||date_str||')
SEGMENT CREATION IMMEDIATE';
您需要一个空白 space,分区名称是
我正在尝试使用每年 1 月 1 日 运行 的过程在分区 table 上按月添加分区。
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;
当我 运行 这个程序时我得到这个错误
ORA-00907: missing right parenthesis
我尝试使用绑定值而不是连接
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: invalid datatype
如果我尝试使用硬编码值,它可以正常工作。但我需要一些动态的东西。
还有一种方法可以在 G11 中添加多个分区,而无需 运行 多个 alter 查询?我试过了,但我认为它只适用于 G12+
ALTER TABLE TEST1 ADD PARTITION t1... PARTITION t2...
谢谢
您需要像这样将日期值转换为日期文字:
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'')';
下载 PL/SQL 实用程序包
你的序列应该是这样的:
sql_val := 'ALTER TABLE TEST1
ADD PARTITION '||' '||part|| ' ' ||' VALUES LESS THAN ('||date_str||')
SEGMENT CREATION IMMEDIATE';
您需要一个空白 space,分区名称是