|
| 1 | + |
| 2 | +-- The following script export some ORACLE tables into SQL insert statments |
| 3 | +-- It use MIGRATION_COLUMNS_SETTINGS, MIGRATION_TABELS_LIST table to change the columns names |
| 4 | + |
| 5 | +BEGIN |
| 6 | + DBMS_OUTPUT.PUT_LINE('STARTING'); |
| 7 | +END; |
| 8 | + |
| 9 | +/ |
| 10 | +-- Check if MIGRATION_COLUMNS_SETTINGS table exits or create it |
| 11 | +DECLARE |
| 12 | +nCount NUMBER; |
| 13 | +v_sql LONG; |
| 14 | + |
| 15 | +BEGIN |
| 16 | +--DBMS_OUTPUT.PUT_LINE('Check MIGRATION_COLUMNS_SETTINGS table exists?'); |
| 17 | +SELECT count(*) into nCount FROM dba_tables where table_name = 'MIGRATION_COLUMNS_SETTINGS'; |
| 18 | +IF(nCount <= 0) |
| 19 | +THEN |
| 20 | +-- DBMS_OUTPUT.PUT_LINE('No, MIGRATION_COLUMNS_SETTINGS table not exists, Creating new one...'); |
| 21 | + v_sql:=' |
| 22 | + create table MIGRATION_COLUMNS_SETTINGS |
| 23 | + ( |
| 24 | + ID NUMBER(3), |
| 25 | + TABLE_NAME VARCHAR2(30) NOT NULL, |
| 26 | + OLD_COLUMN_NAME VARCHAR2(30) NOT NULL, |
| 27 | + NEW_COLUMN_NAME VARCHAR2(30) NOT NULL |
| 28 | + )'; |
| 29 | + execute immediate v_sql; |
| 30 | +--ELSE |
| 31 | +--DBMS_OUTPUT.PUT_LINE('Yes MIGRATION_COLUMNS_SETTINGS table exists.'); |
| 32 | +END IF; |
| 33 | + |
| 34 | +END; |
| 35 | + |
| 36 | + |
| 37 | + |
| 38 | +--declare |
| 39 | +-- fHandle UTL_FILE.FILE_TYPE; |
| 40 | +--begin |
| 41 | +-- fHandle := UTL_FILE.FOPEN('my_directory', 'test_file', 'w'); |
| 42 | +-- |
| 43 | +-- UTL_FILE.PUT(fHandle, 'This is the first line'); |
| 44 | +-- UTL_FILE.PUT(fHandle, 'This is the second line'); |
| 45 | +-- UTL_FILE.PUT_LINE(fHandle, 'This is the third line'); |
| 46 | +-- |
| 47 | +-- UTL_FILE.FCLOSE(fHandle); |
| 48 | +--EXCEPTION |
| 49 | +-- WHEN OTHERS THEN |
| 50 | +-- DBMS_OUTPUT.PUT_LINE('Exception: SQLCODE=' || SQLCODE || ' SQLERRM=' || SQLERRM); |
| 51 | +-- RAISE; |
| 52 | +--end; |
| 53 | + |
| 54 | + |
| 55 | +/ |
| 56 | +-- Check if MIGRATION_TABELS_LIST table exits or create it |
| 57 | +DECLARE |
| 58 | +nCount NUMBER; |
| 59 | +v_sql LONG; |
| 60 | + |
| 61 | +BEGIN |
| 62 | +--DBMS_OUTPUT.PUT_LINE('Check MIGRATION_TABELS_LIST table exists?'); |
| 63 | +SELECT count(*) into nCount FROM dba_tables where table_name = 'MIGRATION_TABELS_LIST'; |
| 64 | +IF(nCount <= 0) |
| 65 | +THEN |
| 66 | +-- DBMS_OUTPUT.PUT_LINE('No, MIGRATION_TABELS_LIST table not exists, Creating new one...'); |
| 67 | + v_sql:=' |
| 68 | + create table MIGRATION_TABELS_LIST |
| 69 | + ( |
| 70 | + ID NUMBER(3), |
| 71 | + TABLE_NAME VARCHAR2(30) NOT NULL |
| 72 | + )'; |
| 73 | + execute immediate v_sql; |
| 74 | +--ELSE |
| 75 | +--DBMS_OUTPUT.PUT_LINE('Yes MIGRATION_TABELS_LIST table exists.'); |
| 76 | +END IF; |
| 77 | + |
| 78 | +END; |
| 79 | + |
| 80 | + |
| 81 | +/ |
| 82 | + |
| 83 | + |
| 84 | +-- Create method to get new columns names |
| 85 | +-- GET_COLUMN_NAME is function to get new column names from MIGRATION_COLUMNS_SETTINGS table |
| 86 | +CREATE OR REPLACE FUNCTION GET_COLUMN_NAME ( table_name VARCHAR2, column_name VARCHAR2 ) |
| 87 | + RETURN READ_ONLY.MIGRATION_COLUMNS_SETTINGS.NEW_COLUMN_NAME%TYPE |
| 88 | + IS |
| 89 | + NEW_NAME READ_ONLY.MIGRATION_COLUMNS_SETTINGS.NEW_COLUMN_NAME%TYPE; |
| 90 | + BEGIN |
| 91 | +-- DBMS_OUTPUT.PUT_LINE('START SELECTING table_name:' || table_name || ' column_name:' || column_name ); |
| 92 | + SELECT NEW_COLUMN_NAME |
| 93 | + INTO NEW_NAME |
| 94 | + FROM READ_ONLY.MIGRATION_COLUMNS_SETTINGS |
| 95 | + WHERE TABLE_NAME = table_name AND OLD_COLUMN_NAME = column_name; |
| 96 | + |
| 97 | + RETURN NEW_NAME; |
| 98 | + |
| 99 | + EXCEPTION |
| 100 | + WHEN OTHERS THEN |
| 101 | + NEW_NAME := column_name; |
| 102 | +-- DBMS_OUTPUT.PUT_LINE('Error SELECTING ' || 'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM); |
| 103 | +-- DBMS_OUTPUT.PUT_LINE('END SELECTING column_name:' || column_name || ' NEW_NAME:' || NEW_NAME ); |
| 104 | + NEW_NAME := column_name; |
| 105 | + RETURN NEW_NAME; |
| 106 | + |
| 107 | +END GET_COLUMN_NAME; |
| 108 | + |
| 109 | +/ |
| 110 | + |
| 111 | + |
| 112 | +-- create path for migration |
| 113 | + |
| 114 | +create or replace directory temp_dir as 'C:\temp'; |
| 115 | +/ |
| 116 | +grant read, write on directory temp_dir to PUBLIC |
| 117 | +/ |
| 118 | + |
| 119 | +-- Start migration |
| 120 | +DECLARE |
| 121 | + cur SYS_REFCURSOR; |
| 122 | + curid NUMBER; |
| 123 | + desctab DBMS_SQL.desc_tab; |
| 124 | + colcnt NUMBER; |
| 125 | + namevar VARCHAR2(4000); |
| 126 | + numvar NUMBER; |
| 127 | + datevar DATE; |
| 128 | + total_row_fetched number:=0; |
| 129 | + file_name varchar(50):=''; |
| 130 | + out_columns varchar2(10000); |
| 131 | + out_values varchar2(10000); |
| 132 | + fHandle UTL_FILE.FILE_TYPE; |
| 133 | + batch_file_number NUMBER := 1; |
| 134 | + |
| 135 | +BEGIN |
| 136 | + |
| 137 | + -- fHandle := UTL_FILE.FOPEN('EXP_CSV', 'out.sql', 'w'); |
| 138 | + -- write to file with name |
| 139 | + -- fHandle := UTL_FILE.FOPEN('EXP_CSV', 'out'|| TO_CHAR(sysdate, 'yyyy-mm-dd hh:mm' )||'-part-'|| batch_file_number ||'.sql', 'w'); |
| 140 | + -- get list of tabels to log |
| 141 | + FOR rec IN (SELECT TABLE_NAME |
| 142 | + FROM MIGRATION_TABELS_LIST |
| 143 | + ORDER BY TABLE_NAME) |
| 144 | + LOOP |
| 145 | + OPEN cur FOR 'SELECT * FROM '||rec.TABLE_NAME||' ORDER BY 1'; |
| 146 | + DBMS_OUTPUT.put_line('Working on table:' ||rec.TABLE_NAME); |
| 147 | + |
| 148 | + |
| 149 | + |
| 150 | + |
| 151 | + |
| 152 | + |
| 153 | + curid := DBMS_SQL.to_cursor_number(cur); |
| 154 | + DBMS_SQL.describe_columns(curid, colcnt, desctab); |
| 155 | + |
| 156 | + out_columns := 'INSERT INTO '||rec.TABLE_NAME||'('; |
| 157 | + |
| 158 | + |
| 159 | + |
| 160 | + |
| 161 | + |
| 162 | + FOR indx IN 1 .. colcnt LOOP |
| 163 | + |
| 164 | + -- get table name and column name, check if they are exist in the MIGRATION_COLUMNS_SETTINGS |
| 165 | + -- if it exists get the new name, else use current name |
| 166 | + out_columns := out_columns||READ_ONLY.GET_COLUMN_NAME( rec.TABLE_NAME , desctab(indx).col_name )||','; |
| 167 | + IF desctab (indx).col_type = 2 |
| 168 | + THEN |
| 169 | + DBMS_SQL.define_column (curid, indx, numvar); |
| 170 | + ELSIF desctab (indx).col_type = 12 |
| 171 | + THEN |
| 172 | + DBMS_SQL.define_column (curid, indx, datevar); |
| 173 | + ELSE |
| 174 | + DBMS_SQL.define_column (curid, indx, namevar, 4000); |
| 175 | + END IF; |
| 176 | + END LOOP; |
| 177 | + |
| 178 | + out_columns := rtrim(out_columns,',')||') VALUES ('; |
| 179 | + |
| 180 | + WHILE DBMS_SQL.fetch_rows (curid) > 0 |
| 181 | + LOOP |
| 182 | + out_values := ''; |
| 183 | + FOR indx IN 1 .. colcnt |
| 184 | + LOOP |
| 185 | + IF (desctab (indx).col_type = 1) |
| 186 | + THEN |
| 187 | + DBMS_SQL.COLUMN_VALUE (curid, indx, namevar); |
| 188 | + out_values := out_values||''''||namevar||''','; |
| 189 | + ELSIF (desctab (indx).col_type = 2) |
| 190 | + THEN |
| 191 | + DBMS_SQL.COLUMN_VALUE (curid, indx, numvar); |
| 192 | + out_values := out_values||numvar||','; |
| 193 | + ELSIF (desctab (indx).col_type = 12) |
| 194 | + THEN |
| 195 | + DBMS_SQL.COLUMN_VALUE (curid, indx, datevar); |
| 196 | + out_values := out_values|| |
| 197 | + 'to_date('''||to_char(datevar,'DD.MM.YYYY HH24:MI:SS')|| |
| 198 | + ''',''DD.MM.YYYY HH24:MI:SS''),'; |
| 199 | + END IF; |
| 200 | + END LOOP; |
| 201 | + DBMS_OUTPUT.put_line(out_columns||rtrim(out_values,',')||');'); |
| 202 | + -- create new file for each 2M record |
| 203 | + -- write to file with name |
| 204 | + if mod ( total_row_fetched, 2 ) = 0 then |
| 205 | + /* close old file, open new */ |
| 206 | + -- if file open close it |
| 207 | + if SYS.UTL_FILE.IS_OPEN(fHandle)then |
| 208 | + UTL_FILE.FCLOSE(fHandle); |
| 209 | + end if; |
| 210 | + |
| 211 | + |
| 212 | + file_name := 'out-'|| TO_CHAR(sysdate, 'yyyy-mm-dd-hh:mm' )||'-part-'|| batch_file_number ||'.sql'; |
| 213 | + batch_file_number := batch_file_number + 1; |
| 214 | + fHandle := UTL_FILE.FOPEN('EXP_CSV',file_name , 'w'); |
| 215 | + DBMS_OUTPUT.put_line('file: ' ||file_name ); |
| 216 | + DBMS_OUTPUT.put_line('total_row_fetched: ' || total_row_fetched); |
| 217 | + |
| 218 | + end if; |
| 219 | + total_row_fetched := total_row_fetched + 1; |
| 220 | + -- write to file |
| 221 | + UTL_FILE.PUT_LINE(fHandle, out_columns||rtrim(out_values,',')||');'); |
| 222 | + |
| 223 | + |
| 224 | + END LOOP; |
| 225 | + |
| 226 | + DBMS_SQL.close_cursor (curid); |
| 227 | + |
| 228 | + END LOOP; |
| 229 | + UTL_FILE.FCLOSE(fHandle); |
| 230 | + DBMS_OUTPUT.put_line('FINISHED'); |
| 231 | + EXCEPTION |
| 232 | + WHEN OTHERS THEN |
| 233 | + DBMS_OUTPUT.PUT_LINE('Exception: SQLCODE=' || SQLCODE || ' SQLERRM=' || SQLERRM); |
| 234 | + RAISE; |
| 235 | +END; |
| 236 | +/ |
| 237 | + |
| 238 | + |
| 239 | + |
0 commit comments