Skip to content

Commit 35f3811

Browse files
authored
Update README.md
1 parent 8384c3a commit 35f3811

File tree

1 file changed

+246
-2
lines changed

1 file changed

+246
-2
lines changed

‎README.md

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

0 commit comments

Comments
 (0)