summaryrefslogtreecommitdiff
path: root/sql/sqlupdate(20140516-20140516)-createTable.sql
blob: 27d3b5f3fbe2edd0d36269bf747004443ef86285 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
--修改创建表存储过程的注释
create or replace procedure pro_createTable(tabName IN VARCHAR2,filedAndType IN VARCHAR2,indexfileds in varchar2)
Authid Current_User----使存储过程可以使用role权限
is
---
     c_oracle_data_dir             CONSTANT VARCHAR2(200) :='/data/d4/oradata/ict/nmspartition/'; --表空间文件存放的路径
     c_tablespace_init_size        CONSTANT VARCHAR2(10) :='10M'; --表空间初始化大小
     c_tablespace_extend_size      CONSTANT VARCHAR2(10) :='5M'; --表空间每次自动扩长大小
     c_log_table_name              CONSTANT VARCHAR2(100) :='PRO_EXEC_LOG'; --日志记录在此表内
     c_cur_pro_name                CONSTANT VARCHAR2(100) :='pro_createTable'; --当前存储过程的名称
---
     v_create_tablespace_sql       VARCHAR2(5000);
     v_log_table_sql               VARCHAR2(5000);
     v_sql1                        VARCHAR2(5000);
---    
     part_time                     VARCHAR2(64);--第一个分区的后缀名
     part_time_format              VARCHAR2(64);--第一个分区的时间比较字符串
     part_time2                    VARCHAR2(64);--第二个分区的后缀名
     part_time2_format             VARCHAR2(64);--第二个分区的时间比较字符串
begin
--------------------------------------- 
--修改为按天分区后的修改     
     v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''1'',''1.创建以表名命名的表空间(用于主键索引) begin'')';
     EXECUTE IMMEDIATE v_log_table_sql;
     COMMIT;    
     
     --创建以表名命名的表空间(用于主键索引)
     v_create_tablespace_sql := 'CREATE BIGFILE TABLESPACE '||tabName||' DATAFILE '''||c_oracle_data_dir||tabName||'.dbf'' SIZE '||c_tablespace_init_size||' AUTOEXTEND ON NEXT '||c_tablespace_extend_size||' MAXSIZE UNLIMITED';
     execute immediate v_create_tablespace_sql;
     
     v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''2'',''2.创建以表名命名的表空间(用于主键索引) end'')';
     EXECUTE IMMEDIATE v_log_table_sql;
     COMMIT; 
---------------------------------------    
     v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''3'',''3.查询当前时间 begin'')';
     EXECUTE IMMEDIATE v_log_table_sql;
     COMMIT;    
     
     --查询当前时间
     select to_char(sysdate,'yyyyMMdd') into part_time from dual; 
     select to_char(sysdate,'yyyy-MM-dd HH24:MI:SS') into part_time_format from dual; 
     
     v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''4'',''4.查询当前时间:'||part_time||' end'')';
     EXECUTE IMMEDIATE v_log_table_sql;
     COMMIT; 
---------------------------------------   
     v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''5'',''5.创建第一个分区的表空间 begin'')';
     EXECUTE IMMEDIATE v_log_table_sql;
     COMMIT; 
         
     --创建第一个分区的表空间
     v_create_tablespace_sql := 'CREATE BIGFILE TABLESPACE '||tabName||'_'||part_time||' DATAFILE '''||c_oracle_data_dir||tabName||'_'||part_time||'.dbf'' SIZE '||c_tablespace_init_size||' AUTOEXTEND ON NEXT '||c_tablespace_extend_size||' MAXSIZE UNLIMITED';
     execute immediate v_create_tablespace_sql;
     
     v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''6'',''6.创建第一个分区的表空间 end'')';
     EXECUTE IMMEDIATE v_log_table_sql;
     COMMIT; 
---------------------------------------      
     v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''7'',''7.查询第二天的时间 begin'')';
     EXECUTE IMMEDIATE v_log_table_sql;
     COMMIT; 
         
     --查询第二天的时间,避免错过定时创建分区的执行时间
     select to_char(sysdate+1,'yyyyMMdd') into part_time2 from dual; 
     select to_char(sysdate+1,'yyyy-MM-dd HH24:MI:SS') into part_time2_format from dual; 
     
     v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''8'',''8.查询第二天的时间:'||part_time2||' end'')';
     EXECUTE IMMEDIATE v_log_table_sql;
     COMMIT; 
---------------------------------------     
     v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''9'',''9.创建第二个分区的表空间 begin'')';
     EXECUTE IMMEDIATE v_log_table_sql;
     COMMIT;  
          
     --创建第二个分区的表空间
     v_create_tablespace_sql := 'CREATE BIGFILE TABLESPACE '||tabName||'_'||part_time2||' DATAFILE '''||c_oracle_data_dir||tabName||'_'||part_time2||'.dbf'' SIZE '||c_tablespace_init_size||' AUTOEXTEND ON NEXT '||c_tablespace_extend_size||' MAXSIZE UNLIMITED';
     execute immediate v_create_tablespace_sql;
     
     v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''10'',''10.创建第二个分区的表空间 end'')';
     EXECUTE IMMEDIATE v_log_table_sql;
     COMMIT; 
--------------------------------------   
     v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''11'',''11.建表 begin'')';
     EXECUTE IMMEDIATE v_log_table_sql;
     COMMIT; 
     
     --建表
     v_sql1 :='create table '||tabName ||'(id number not null primary key,detection_info_id number not null ,'||filedAndType||',DETECTIONED_STATE varchar(2),SEQ_ID number,DETECTION_SET_INFO_ID number,data_check_time DATE,data_arrive_time DATE,data_check_time_digital number,data_arrive_time_digital number,foreign KEY(detection_info_id) REFERENCES detection_info(id))'||
              'partition by range(DATA_CHECK_TIME)'||'(partition '||tabName||'_'||part_time||' values less than(to_date('''||part_time_format||''',''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN'')) tablespace '||tabName||'_'||part_time||' storage(initial 10M next 10M maxextents unlimited ),'||
                                                      'partition '||tabName||'_'||part_time2||' values less than(to_date('''||part_time2_format||''',''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN'')) tablespace '||tabName||'_'||part_time2||' storage(initial 10M next 10M maxextents unlimited ))';
     EXECUTE IMMEDIATE v_sql1;
     
     v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''12'',''12.建表 end'')';
     EXECUTE IMMEDIATE v_log_table_sql;
     COMMIT;       
---------------------------------------
     v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''13'',''13.创建seq begin'')';
     EXECUTE IMMEDIATE v_log_table_sql;
     COMMIT; 
     
     --创建seq
     pro_createSeq(tabName);
     
     v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''14'',''14.创建seq end'')';
     EXECUTE IMMEDIATE v_log_table_sql;
     COMMIT; 
---------------------------------------
     v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''15'',''15.创建触发器 begin'')';
     EXECUTE IMMEDIATE v_log_table_sql;
     COMMIT; 
     
     --创建触发器
     pro_createTrigger(tabName);
     
     v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''16'',''16.创建触发器 end'')';
     EXECUTE IMMEDIATE v_log_table_sql;
     COMMIT;  
---------------------------------------
     v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''17'',''17.创建索引 begin'')';
     EXECUTE IMMEDIATE v_log_table_sql;
     COMMIT;  
     
     --创建索引    
     pro_createindex(tabName,indexfileds);  
     
     v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''18'',''18.创建索引 end'')';
     EXECUTE IMMEDIATE v_log_table_sql;
     COMMIT; 
----------------------------------------
EXCEPTION
     --异常处理机制,记录相关的ora错误号以及相关异常信息
     WHEN OTHERS THEN
     BEGIN
         ROLLBACK;
         v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''-1'',''error:'||SQLERRM||''')';
         EXECUTE IMMEDIATE v_log_table_sql;
         COMMIT;
     END;
end pro_createTable;


--修改创建SEQ的存储过程:添加日志信息
create or replace procedure pro_createSeq(tabName IN VARCHAR2) is
--- 
     c_log_table_name              CONSTANT VARCHAR2(100) :='PRO_EXEC_LOG'; --日志记录在此表内
     c_cur_pro_name                CONSTANT VARCHAR2(100) :='pro_createSeq'; --当前存储过程的名称
---
     v_log_table_sql               VARCHAR2(5000);
     v_sql1                        VARCHAR2(5000);
begin
    v_sql1 :='create sequence SEQ_'||tabName||'
              minvalue 1
              maxvalue 999999999999
              start with 1
              increment by 1
              cache 20
              cycle
              order';    
    --将创建seq的sql语句存入日志表
    v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''1'',''1.创建SEQ的SQL语句:'||v_sql1||''')';
    EXECUTE IMMEDIATE v_log_table_sql;
    COMMIT;
   
    EXECUTE IMMEDIATE v_sql1;    

EXCEPTION
       WHEN OTHERS THEN
       BEGIN
           ROLLBACK;
           v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''-1'',''error:'||SQLERRM||''')';
           EXECUTE IMMEDIATE v_log_table_sql;
           COMMIT;
       END;
end pro_createSeq;


--修改创建触发器的存储过程:添加日志信息
create or replace procedure pro_createTrigger(tabName IN VARCHAR2) is
--- 
     c_log_table_name              CONSTANT VARCHAR2(100) :='PRO_EXEC_LOG'; --日志记录在此表内
     c_cur_pro_name                CONSTANT VARCHAR2(100) :='pro_createTrigger'; --当前存储过程的名称
---
     v_log_table_sql               VARCHAR2(5000);
     v_sql1                        VARCHAR2(5000);
begin
    v_sql1 :='Create Or Replace Trigger B_I_'||tabName ||' before insert on '||tabName||' for each row
              declare
              
              begin
              if ( :new.id is null )   --insert
              then
                   select seq_'||tabName ||'.nextVal into :new.id from dual;
              end if;
                   end B_I_'||tabName||';';
    --将创建触发器的sql语句存入日志表
    v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''1'',''1.创建触发器的SQL语句:'||v_sql1||''')';
    EXECUTE IMMEDIATE v_log_table_sql;
    COMMIT;    
    
    EXECUTE IMMEDIATE v_sql1;

EXCEPTION    
    WHEN OTHERS THEN
       BEGIN
           ROLLBACK;
           v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''-1'',''error:'||SQLERRM||''')';
           EXECUTE IMMEDIATE v_log_table_sql;
           COMMIT;
       END;
end pro_createTrigger;


--创建索引,添加日志
create or replace procedure pro_createIndex(tabName IN VARCHAR2,fileds IN VARCHAR2) is
--- 
     c_log_table_name              CONSTANT VARCHAR2(100) :='PRO_EXEC_LOG'; --日志记录在此表内
     c_cur_pro_name                CONSTANT VARCHAR2(100) :='pro_createIndex'; --当前存储过程的名称
---
     v_log_table_sql               VARCHAR2(5000);
     sposition1                    INTEGER;
     sposition2                    INTEGER;
     mysubstr                      VARCHAR2(100);
     starttimes                    INTEGER;
     splitStr                      VARCHAR2(10);
     v_sql1                        VARCHAR2(100);
begin
        starttimes := 1;
        sposition1 := 1;
        splitStr := ':';
        loop
            sposition2 := instr(fileds, splitStr, 1, starttimes);
            mysubstr   := substr(fileds, sposition1, sposition2 - sposition1);
            
            if mysubstr is null
            then
               exit;
            end if;
            
            v_sql1:='create index '||tabName||'_'||starttimes ||' on '||tabName||'('||mysubstr||') local';
            EXECUTE IMMEDIATE v_sql1;
            
            sposition1 := sposition2 + 1;
            starttimes := starttimes + 1;
            dbms_output.put_line(mysubstr); 
            
            exit when sposition2 = 0;
        end loop;
        dbms_output.put_line('end');

EXCEPTION
       WHEN OTHERS THEN
       BEGIN
           ROLLBACK;
           v_log_table_sql :=  'INSERT INTO '||c_log_table_name||'(id,proname,sequence,log_cont) VALUES(SEQ_PRO_EXEC_LOG.nextval,'''||c_cur_pro_name||''',''-1'',''error:'||SQLERRM||''')';
           EXECUTE IMMEDIATE v_log_table_sql;
           COMMIT;
       END;
end;