1. 程式人生 > >傳入時間按月分區並創建每月表空間

傳入時間按月分區並創建每月表空間

line trunc space then 如果 dex sql語句 amp 空間名


--1 創建每個索引分區依存的表空間
declare

v_ts varchar2(40);
v_indts varchar2(40);
v_mxtabts varchar2(40); --明細數據表空間
v_mxindts varchar2(40); --明細索引表空間

t_mon date; --把傳入值 轉換為 日期 傳入格式:201609
t_mon1 varchar2(2000);
t_qssj date; --把傳入起始時間 轉換為 日期 格式:201609
t_zzsj date; --把傳入終止時間 轉換為 日期 格式:201609
c_thismonth char(4); --取出當前月
c_nextmonth char(4); --取出下個月
v_sql varchar2(2000); --要執行的sql語句
c_str01 varchar2(2000);
c_str02 varchar2(2000);

begin

dbms_output.put_line(‘First is starting‘);

t_qssj := to_date(‘&qssj‘, ‘yyyymm‘); --傳入參數 起始時間 01-8 月 -16
t_zzsj := to_date(‘&zzsj‘, ‘yyyymm‘); --插入參數 終止時間 01-9 月 -16

if to_char(t_qssj, ‘yyyymm‘) <> ‘&qssj‘ --判斷傳入的 起始時間、終止時間是否合法
or to_char(t_zzsj, ‘yyyymm‘) <> ‘&zzsj‘ then
dbms_output.put_line(‘----------------------------------------‘);
dbms_output.put_line(‘錯誤: 輸入的月份格式必須為‘‘YYYYMM‘‘‘);

end if;

--if t_qssj <= trunc(sysdate,‘mm‘) then
-- dbms_output.put_line(‘----------------------------------------‘);
-- dbms_output.put_line(‘錯誤: 起始月必須大於當前月份‘);
-- goto endproc;
--end if;

if ‘&zzsj‘ < ‘&qssj‘ then
--如果插入的 終止時間 小於 起始時間 ,退出
dbms_output.put_line(‘----------------------------------------‘);
dbms_output.put_line(‘錯誤: 終止月必須大於起始月‘);

end if;

t_mon := to_date(‘&qssj‘, ‘yyyymm‘); --把傳入值 轉換為 日期 輸出格式:01-8月 -16
dbms_output.put_line(‘t_mon is ‘ || t_mon);
c_nextmonth := to_char(t_mon, ‘yymm‘); --轉換的日期 轉換為字符串 輸出格式:01-8月 -16
dbms_output.put_line(‘c_nextmonth is ‘ || c_nextmonth);

loop
c_thismonth := c_nextmonth; --取出 當前月份 輸出格式:1608 char
dbms_output.put_line(‘c_thismonth is ‘ || c_thismonth);
t_mon := add_months(t_mon, 1); --傳入值遞增一個月 輸出格式:01-9月 -16
t_mon1:=to_char(t_mon,‘yyyy-mm-dd hh24:mi:ss‘);
dbms_output.put_line(‘t_mon is ‘ || t_mon);
dbms_output.put_line(‘t_mon1 is ‘||to_char(t_mon,‘yyyy-mm-dd hh24:mi:ss‘));
c_nextmonth := to_char(t_mon, ‘yymm‘); --取出遞增一個月後的字符串 輸出格式:1608 字符串
dbms_output.put_line(‘c_nextmonth is ‘ || c_nextmonth);
-- 明細表空間名
v_mxtabts := ‘lvsksk_t_m_‘ || c_thismonth; --拼接明細表空間名 如:lvsksk_t_m_1608
dbms_output.put_line(‘v_mxtabts is ‘ || v_mxtabts);
-- 明細索引空間名
v_mxindts := ‘lvsksk_i_m_‘ || c_thismonth; --拼接明細索引表空間名 如: lvsksk_i_m_1608
dbms_output.put_line(‘v_mxindts is ‘ || v_mxindts);

-- c_str02:=c_str02||‘partition p‘||c_thismonth ||‘ values less than (‘||t_mon||‘) tablespace ‘ ||v_mxindts||‘,‘||chr(10) ;
c_str02:=c_str02||‘partition p‘||c_thismonth ||‘ values less than (TO_DATE(‘||‘‘‘‘||t_mon1||‘‘‘‘||‘, ‘‘SYYYY-MM-DD HH24:MI:SS‘‘, ‘‘NLS_CALENDAR=GREGORIAN‘‘)) tablespace ‘ ||v_mxindts||‘,‘||chr(10) ;


exit when to_char(t_mon, ‘yyyymm‘) > ‘&zzsj‘;
end loop;
c_str01:=‘create index dzfpmx01_index_jssj on JS_SKSKJDK_DZFPMX01(JSSJ)
global
partition by range(jssj)
(‘||c_str02||‘partition p_default values less than (maxvalue) tablespace users)‘;
-- dbms_output.put_line(‘c_str01 is ‘||chr(10)||c_str01||‘);‘

execute immediate c_str01;

exception
when others then
dbms_output.put_line(sqlerrm);



end;


/*
First is starting
t_mon is 01-1月 -01
c_nextmonth is 0101
c_thismonth is 0101
t_mon is 01-2月 -01
t_mon1 is 3001-02-01 00:00:00
c_nextmonth is 0102
v_mxtabts is lvsksk_t_m_0101
v_mxindts is lvsksk_i_m_0101
c_thismonth is 0102
t_mon is 01-3月 -01
t_mon1 is 3001-03-01 00:00:00
c_nextmonth is 0103
v_mxtabts is lvsksk_t_m_0102
v_mxindts is lvsksk_i_m_0102
c_thismonth is 0103
t_mon is 01-4月 -01
t_mon1 is 3001-04-01 00:00:00
c_nextmonth is 0104
v_mxtabts is lvsksk_t_m_0103
v_mxindts is lvsksk_i_m_0103
c_thismonth is 0104
t_mon is 01-5月 -01
t_mon1 is 3001-05-01 00:00:00
c_nextmonth is 0105
v_mxtabts is lvsksk_t_m_0104
v_mxindts is lvsksk_i_m_0104
c_thismonth is 0105
t_mon is 01-6月 -01
t_mon1 is 3001-06-01 00:00:00
c_nextmonth is 0106
v_mxtabts is lvsksk_t_m_0105
v_mxindts is lvsksk_i_m_0105
ORA-00955: 名稱已由現有對象使用

*/

傳入時間按月分區並創建每月表空間