テストデータはinsert文じゃないと嫌な人は、これに手を加えて再利用できるかも?
クエリ
with param as ( select 'SAKURAGI' as owner, 'EMP' as table_name from dual ), seq as ( select rownum as value from dual connect by rownum <= 5 ), data as ( select s.value, tc.table_name, tc.column_id, tc.column_name, tc.data_type, tc.nullable, case when tc.data_type = any('CHAR', 'VARCHAR2') then tc.data_type || '(' || tc.char_length || ')' when tc.data_type = 'NUMBER' then tc.data_type || '(' || tc.data_length || ',' || nvl(tc.data_scale, 0) || ')' else tc.data_type end as data_type_text, case when tc.data_type = any('CHAR', 'VARCHAR2') then lpad(s.value, tc.char_length, '0') when tc.data_type = 'DATE' then 'to_date(''' || to_char(sysdate+s.value, 'yyyy-mm-dd HH24:mi:ss') || ''', ''yyyy-mm-dd HH24:mi:ss'')' else rtrim(to_char(s.value) || '.' || lpad(s.value, tc.data_scale, '0'), '.') end as sample_value from all_tab_cols tc, seq s, param where tc.owner = param.owner and tc.table_name = param.table_name order by tc.column_id ), formatted_data as ( select d.*, case when d.data_type = any('CHAR', 'VARCHAR2') then '''' || d.sample_value || '''' else d.sample_value end as formatted_value from data d order by d.column_id ), idx_info as ( select col.column_id, col.table_name, col.column_name, ind_col.index_name, cons.constraint_name, cons.constraint_type from user_tab_cols col inner join user_ind_columns ind_col on ind_col.table_name = col.table_name and ind_col.column_name = col.column_name inner join user_constraints cons on cons.table_name = ind_col.table_name and cons.index_name = ind_col.index_name, param where col.table_name = param.table_name ), create_parts as ( select d.table_name, listagg( d.column_name || ' ' || d.data_type_text || (case when d.nullable = 'N' then ' not null' end), ', ' ) within group (order by d.column_id) as column_list from data d where d.value = 1 group by d.table_name ), insert_parts as ( select d.value, d.table_name, ----- case 1 ----- --rtrim(regexp_replace(xmlagg(xmlelement(TAG,d.column_name||',') order by d.column_id), '?TAG>', ''), ',') as column_list, --replace(rtrim(regexp_replace(xmlagg(xmlelement(TAG,d.formatted_value||',') order by d.column_id), '?TAG>', ''), ','), chr(38)||'apos;', '''') as value_list ----- case 2 ----- listagg(d.column_name, ', ') within group (order by d.column_id) as column_list, listagg(d.formatted_value, ', ') within group (order by d.column_id) as value_list from formatted_data d group by d.value, d.table_name ) select 'create table ' || p.table_name || ' (' || p.column_list || (case when idx.column_list is not null then (', primary key(' || idx.column_list || ')') end) || ');' as query from create_parts p left outer join ( select idx.table_name, listagg(idx.column_name, ', ') within group (order by idx.column_id) as column_list from idx_info idx group by idx.table_name ) idx on idx.table_name = p.table_name union all select 'insert into ' || p.table_name || ' (' || p.column_list || ')' || ' values (' || p.value_list || ');' as query from insert_parts p ;
実行結果
create table EMP (EMPNO NUMBER(22,0) not null, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(22,0), HIREDATE DATE, SAL NUMBER(22,2), COMM NUMBER(22,2), DEPTNO NUMBER(22,0), primary key(EMPNO)); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (1, '0000000001', '000000001', 1, to_date('2012-08-26 16:07:22', 'yyyy-mm-dd HH24:mi:ss'), 1.01, 1.01, 1); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (2, '0000000002', '000000002', 2, to_date('2012-08-27 16:07:22', 'yyyy-mm-dd HH24:mi:ss'), 2.02, 2.02, 2); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (3, '0000000003', '000000003', 3, to_date('2012-08-28 16:07:22', 'yyyy-mm-dd HH24:mi:ss'), 3.03, 3.03, 3); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (4, '0000000004', '000000004', 4, to_date('2012-08-29 16:07:22', 'yyyy-mm-dd HH24:mi:ss'), 4.04, 4.04, 4); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (5, '0000000005', '000000005', 5, to_date('2012-08-30 16:07:22', 'yyyy-mm-dd HH24:mi:ss'), 5.05, 5.05, 5);
0 件のコメント:
コメントを投稿