oracle自動創建分區表腳本
Ⅰ oracle分區表如何每月自動增加分區
在oracle中如果涉及到自動的任務一般採用job的方法。
1 自己寫一個存儲過程。這個存儲過程的目的就是給分區表增加一個分區。
2 新建一個Job,設定每個月某個時刻調用你寫的存儲過程
這樣就能達到你每月自動增加分區的需求。
Ⅱ 如何在Oracle伺服器端用腳本創建表空間,實例
1、月底我用來創建TS(表空間)的shell,
現在的TS是VIEWER_DATA_TS,要將其改名為VIEWER_DATA_TS_201410,再創建一個VIEWER_DATA_TS,文件名包含下個月信息201411。
2、為了保證硬碟有足夠的空間,我保留了2年的數據
old_ym=$(date -d -24month +%Y%m)
3、為了確保刪除TS,先刪除TS包含的tables
truncate table VIEWER_${old_ym};
drop table VIEWER_${old_ym} purge;
DROP TABLESPACE VIEWER_DATA_TS_${old_ym} INCLUDING CONTENTS AND DATAFILES;
4、腳本實例
#!/bin/sh
. ~/.bash_profile
this_ym=`date +%Y%m`
next_ym=`date -d 1month +%Y%m`
old_ym=$(date -d -24month +%Y%m)
vts_src=VIEWER_DATA_TS
vts_dst=VIEWER_DATA_TS_${this_ym}
viewer_data_ts1=/data1/oracle/viewer_data_ts_${next_ym}_1.dbf
viewer_data_ts2=/data1/oracle/viewer_data_ts_${next_ym}_2.dbf
sqlplus viewer/user123456 << EOF
alter tablespace $vts_src rename to $vts_dst;
CREATE TABLESPACE $vts_src DATAFILE '$viewer_data_ts1' SIZE 512M AUTOEXTEND ON NEXT 256M MAXSIZE UNLIMITED BLOCKSIZE 16k;
alter TABLESPACE $vts_src add DATAFILE '$viewer_data_ts2' SIZE 512M AUTOEXTEND ON NEXT 256M MAXSIZE UNLIMITED;
truncate table VIEWER_${old_ym};
drop table VIEWER_${old_ym} purge;
DROP TABLESPACE VIEWER_DATA_TS_${old_ym} INCLUDING CONTENTS AND DATAFILES;
EOF
5、計劃任務crontab -l,每月28號執行。
0 3 28 * * /home/oracle/prepare_viewer_ts.sh;
或者
0 4 28-31 * * [ `date -d tomorrow +\%e` -eq 1 ] && /home/oracle/prepare_viewer_ts.sh;
Ⅲ oracle資料庫自動按分區號清除數據的腳本
大致思路是由DBA_TAB_PARTITIONS查詢TABLE_NAME和HIGH_VALUE,來確定PARTION_NAME,通過SQL生成alter table語句。
由於DBA_TAB_PARTIONS的HIGH_VALUE欄位是LONG,這里創建一個自定義包long_help,將LONG轉換為VARCHAR2類型。
createorreplacepackagelong_help
authidcurrent_user
as
functionsubstr_of
(p_queryinvarchar2,
p_frominnumber,
p_forinnumber,
p_name1invarchar2defaultNULL,
p_bind1invarchar2defaultNULL,
p_name2invarchar2defaultNULL,
p_bind2invarchar2defaultNULL,
p_name3invarchar2defaultNULL,
p_bind3invarchar2defaultNULL,
p_name4invarchar2defaultNULL,
p_bind4invarchar2defaultNULL)
returnvarchar2;
end;
/
_help
as
g_cursornumber:=dbms_sql.open_cursor;
g_queryvarchar2(32765);
procerebind_variable(p_nameinvarchar2,p_valueinvarchar2)
is
begin
if(p_nameisnotnull)
then
dbms_sql.bind_variable(g_cursor,p_name,p_value);
endif;
END;
FUNCTIONsubstr_of
(p_queryinvarchar2,
p_frominnumber,
p_forinnumber,
p_name1invarchar2defaultNULL,
p_bind1invarchar2defaultNULL,
p_name2invarchar2defaultNULL,
p_bind2invarchar2defaultNULL,
p_name3invarchar2defaultNULL,
p_bind3invarchar2defaultNULL,
p_name4invarchar2defaultNULL,
p_bind4invarchar2defaultNULL)
returnvarchar2
as
l_buffervarchar2(4000);
l_buffer_lennumber;
begin
if(nvl(p_from,0)<=0)
then
raise_application_error
(-20002,'Frommustbe>=1(positivenumbers)');
endif;
if(nvl(p_for,0)notbetween1and4000)
then
raise_application_error
(-20003,'Formustbebetween1and4000');
endif;
if(p_query<>g_queryorg_queryisNULL)
then
if(upper(trim(nvl(p_query,'x')))notlike'SELECT%')
then
raise_application_error
(-20001,'Thismustbeaselectonly');
endif;
dbms_sql.parse(g_cursor,p_query,dbms_sql.native);
g_query:=p_query;
endif;
bind_variable(p_name1,p_bind1);
bind_variable(p_name2,p_bind2);
bind_variable(p_name3,p_bind3);
bind_variable(p_name4,p_bind4);
dbms_sql.define_column_long(g_cursor,1);
if(dbms_sql.execute_and_fetch(g_cursor)>0)
then
dbms_sql.column_value_long
(g_cursor,1,p_for,p_from-1,
l_buffer,l_buffer_len);
endif;
returnl_buffer;
endsubstr_of;
END;
/
創建一個分區表PART_TABLE,插入三條記錄分別在三個分區中。
CREATETABLEPART_TABLE
(
TABLE_IDNUMBER(8),
SUB_DATEDATE
)
PARTITIONBYRANGE(SUB_DATE)
INTERVAL(NUMTODSINTERVAL(1,'DAY'))
(
PARTITIONP1VALUESLESSTHAN(TO_DATE('2017-12-25','YYYY-MM-DD'))
);
INSERTINTOPART_TABLEVALUES(1,DATE'2017-12-24');
INSERTINTOPART_TABLEVALUES(1,DATE'2017-12-25');
INSERTINTOPART_TABLEVALUES(1,DATE'2017-12-26');
COMMIT;
通過SQL生成alter table語句,截斷第一個分區。
這里需要注意查詢條件是HIGH_VALUE,條件為2017-12-25時,截斷的是最大值為2017-12-25的分區。
SELECT'altertablePART_TABLEtruncatepartition'||PARTITION_NAME||
'updateINDEXES;'
FROM(SELECTTABLE_OWNER,
TABLE_NAME,
PARTITION_NAME,
LONG_HELP.SUBSTR_OF('SELECTHIGH_VALUE
FROMDBA_TAB_PARTITIONSWHERETABLE_OWNER=:TABLE_OWNER
ANDTABLE_NAME=:TABLE_NAME
ANDPARTITION_NAME=:PARTITION_NAME',1,4000,'TABLE_OWNER',TABLE_OWNER,'TABLE_NAME',TABLE_NAME,'PARTITION_NAME',PARTITION_NAME)HIGH_VALUE
FROMDBA_TAB_PARTITIONS)
WHERETABLE_NAME='PART_TABLE'
ANDHIGH_VALUELIKE'%2017-12-25%';
Ⅳ oracle怎樣創建分區表
給一個例子:
create table T_S_SYS_LOG
(
LOG_MONTH VARCHAR2(6),
)
partition by list (LOG_MONTH)
(
partition PRT_M_201309 values ('201309')
tablespace TBS_LBI_SYS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
Ⅳ 如何根據oracle資料庫腳本創建資料庫表
最好安裝第三方開發工具,如PLSQL Developer,然後新建一個SQL窗口,復制腳本到窗口,再點擊執行圖標,就可以創建資料庫表,或其它資料庫對象了。
Ⅵ 關於oracle中創建分區表!我已經編寫出來了 但是有錯誤!有圖
partition by range(sage)
(
partition part1 values less than (20) tablespace example,
partition part2 values less than (31) tablespace orcltbs1,
partition part3 values less than (maxvalue) tablespace orcltbs2 storage(initial 10m next 20m)
)
storage(initial 20m next 10m maxextents 10)
隨便插幾條數據
select * from student_range partition(part1);
select * from student_range partition(part2);
select * from student_range partition(part3);
查詢一下,應該沒問題
Ⅶ oracle如何創建組合分區
oracle組合分區
由於Interval分區是針對range的,11g-12.1版本,目前只有Interval—*一共3種Interval的復合分區
range-list方法:
partition by range (updatetime)
interval (numtodsinterval(1,'day'))
subpartition by list(PSNCODE)
SUBPARTITION TEMPLATE(
SUBPARTITION REGION_1 values('038716'),
SUBPARTITION REGION_2 values('270719') )
(partition p1 values less than(to_date('2014-05-01','yyyy-mm-dd')))
注意:每個分區有2個子分區,分區的子分區需要手動添加
Interval分區目前測試,只支持range先分區的方式
range-hash方法:每個分區10個子hash分區(可以指定每個子分區到單獨的表空間)
partition by range (updatetime)
interval(numtodsinterval(1,'day'))
subpartition by hash(PSNCODE)
SUBPARTITION template
( SUBPARTITION p1 TABLESPACE ts1
, SUBPARTITION p2 TABLESPACE ts2
, SUBPARTITION p3 TABLESPACE ts3
, SUBPARTITION P4 TABLESPACE ts4
)
(partition p1 values less than(to_date('2014-05-01','yyyy-mm-dd')))
注意:這種方式可以實現完全自動的分區,非常適合自增長特性的10位數以上的大表
hash分區最好是2的次方個,不然數據會分布不均
range-range方法:子分區需要手動添加,這種分區需要一般比較少見
PARTITION BY RANGE (time_id)
INTERVAL (NUMTODSINTERVAL(1,'DAY'))
SUBPARTITION BY RANGE(amount_sold)
SUBPARTITION TEMPLATE
( SUBPARTITION p_low VALUES LESS THAN (1000)
, SUBPARTITION p_medium VALUES LESS THAN (4000)
, SUBPARTITION p_high VALUES LESS THAN (8000)
, SUBPARTITION p_ultimate VALUES LESS THAN (maxvalue)
)
(PARTITION before_2000 VALUES LESS THAN (TO_DATE('01-JAN-2000','dd-MON-yyyy')) )
Ⅷ oracle 在創建表時按范圍先分三個分區,然後根據某欄位的值導入數據時自動添加分區,怎麼實現呀。
分區不能只能手工創建,不支持自動創建
Ⅸ Oracle分區表怎麼建唯
1、一般分區表都會很大,所以可以先創建表空間,為了讓分區表存放到單獨的表空間,否則默認會存放到USERS表空間
2、創建TABLESPACE TS1:
CREATE TABLESPACE TS1 DATAFILE '/data1/oracle/test.dbf' SIZE 512M AUTOEXTEND ON NEXT 512M MAXSIZE UNLIMITED;
3、創建分區表,需要確定按什麼分區,比如按id或按時間段:
CREATE TABLE test_201602
(
ID NUMBER(10) NOT NULL,
CREATE_TIME DATE,
)
TABLESPACE TS1
PARTITION BY LIST (ID)
(PARTITION PT_1001 VALUES (1001) TABLESPACE TS1);
4、繼續增加分區
ALTER TABLE test_201602 ADD PARTITION "PT_1003" VALUES (1003) LOGGING NOCOMPRESS;
ALTER TABLE test_201602 ADD PARTITION "PT_1004" VALUES (1004) LOGGING NOCOMPRESS;
5、查詢表及分區數量
select TABLE_NAME,PARTITION_COUNT,DEF_TABLESPACE_NAME from USER_PART_TABLES order by DEF_TABLESPACE_NAME;
Ⅹ ORACLE每天創建一個分區表
可以拼出sql的字元串後用動態sql執行
不過11g有分區表自動增加分區的特性,這個更方便