-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathimp_dp_basic.prc
168 lines (145 loc) · 5.76 KB
/
imp_dp_basic.prc
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
------------------------------------------------------------------------------------
-- File name: imp_dp_basic.prc
-- Purpose: To demonstrate a basic datapump schema import.
-- Author: Christoph Ruepprich
-- http://ruepprich.wordpress.com
-- cruepprich@gmail.com
-- Notes: For educational purposes only.
------------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE imp_db_link IS
l_dp_handle PLS_INTEGER; --datapump job handle
l_job_name VARCHAR2(30); --name for datapump job
l_logfile VARCHAR2(30); --name of log file
l_dpdir VARCHAR2(30); --name of datapump directory object
l_errors PLS_INTEGER := 0; --number of errors logged during monitoring
l_from_schema VARCHAR2(30); --schema from dump file
l_to_schema VARCHAR2(30); --destination schema
l_from_ts VARCHAR2(30); --tablespace from dump file
l_to_ts VARCHAR2(30); --destination tablespace
l_db_link VARCHAR2(30); --database link
e_start_job1 EXCEPTION;
e_start_job2 EXCEPTION;
PRAGMA EXCEPTION_INIT(e_start_job1, -31626); --failed datapump events can leave master table behind
PRAGMA EXCEPTION_INIT(e_start_job2, -31634); --failed datapump events can leave session behind
BEGIN
l_job_name := 'imp_db_link';
l_logfile := l_job_name || '.log';
l_dpdir := 'DATA_PUMP_DIR';
l_db_link := 'db';
l_from_schema := 'SCOTT'; --needs exp_full_database
l_to_schema := 'FRED';
l_from_ts := 'USERS';
l_to_ts := 'FRED_TS';
BEGIN --Open job
l_dp_handle := dbms_datapump.open(operation => 'IMPORT',
job_mode => 'SCHEMA',
job_name => l_job_name,
remote_link => l_db_link);
EXCEPTION
WHEN e_start_job1 THEN
DECLARE
l_table_name VARCHAR2(30);
BEGIN
SELECT nvl(MAX(table_name), 'x')
INTO l_table_name
FROM user_tables
WHERE table_name = l_job_name;
IF l_table_name != 'x'
THEN
dbms_output.put_line('Datapump Master Table ' || l_job_name ||
' exists.');
END IF;
END;
RAISE;
WHEN e_start_job2 THEN
dbms_output.put_line('Check for existing data pump session.');
RAISE;
WHEN OTHERS THEN
raise_application_error(-20000,
'Error when opening job: ' || SQLERRM);
END;
BEGIN --Add log file
dbms_datapump.add_file(handle => l_dp_handle,
filename => l_logfile,
directory => l_dpdir,
filetype => dbms_datapump.ku$_file_type_log_file);
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20020,
'Error when adding log file: ' || SQLERRM);
END;
BEGIN --Remap schema
dbms_datapump.metadata_remap(handle => l_dp_handle,
NAME => 'REMAP_SCHEMA',
old_value => l_from_schema,
VALUE => l_to_schema);
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20032,
'Error when adding metadata remap schema: ' ||
SQLERRM);
END;
BEGIN --Remap tablespace
dbms_datapump.metadata_remap(handle => l_dp_handle,
NAME => 'REMAP_TABLESPACE',
old_value => l_from_ts,
VALUE => l_to_ts);
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20033,
'Error when adding metadata remap ts: ' ||
SQLERRM);
END;
BEGIN --Filter tables only
dbms_datapump.metadata_filter(handle => l_dp_handle,
NAME => 'INCLUDE_PATH_EXPR',
VALUE => 'IN (''TABLE'')');
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20034,
'Error when adding filter tables only: ' ||
SQLERRM);
END;
BEGIN --Filter no triggers
dbms_datapump.metadata_filter(handle => l_dp_handle,
NAME => 'EXCLUDE_PATH_EXPR',
VALUE => 'IN (''TABLE/TRIGGER'')');
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20035,
'Error when adding filter no triggers: ' ||
SQLERRM);
END;
BEGIN --set parameters
dbms_datapump.set_parameter(l_dp_handle, 'TABLE_EXISTS_ACTION', 'APPEND');
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20036,
'Error when adding parameter: ' || SQLERRM);
END;
BEGIN --Start job
dbms_datapump.start_job(handle => l_dp_handle);
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20040,
'Error when starting job: ' || SQLERRM);
END;
BEGIN --Monitor export job
monitor_dp(p_dp_handle => l_dp_handle, p_errors => l_errors);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Error monitoring the dp job <' || SQLERRM || '> ');
RAISE;
END;
BEGIN --Detach job
dbms_datapump.detach(handle => l_dp_handle);
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20050, SQLERRM);
END;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Main exception: ' || SQLERRM);
RAISE;
END imp_db_link;
/