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
| declare
empno NUMBER;
ename VARCHAR2(10);
deptno NUMBER;
source_connid EXEC_SQL.ConnType;
destination_connid EXEC_SQL.ConnType;
source_cursor EXEC_SQL.CursType;
destination_cursor EXEC_SQL.CursType;
dummy PLS_INTEGER;
begin
-- open the connections
source_connid := EXEC_SQL.OPEN_CONNECTION(:source_db);
destination_connid := EXEC_SQL.OPEN_CONNECTION(:dest_db);
-- prepare the cursor to select from source database
source_cursor := EXEC_SQL.OPEN_CURSOR(source_connid);
EXEC_SQL.PARSE(source_connid, source_cursor,'SELECT empno, ename,deptno FROM ' ||:source_tab);
EXEC_SQL.DEFINE_COLUMN(source_connid, source_cursor,1,empno);
EXEC_SQL.DEFINE_COLUMN(source_connid, source_cursor,2,ename,10);
EXEC_SQL.DEFINE_COLUMN(source_connid, source_cursor,3,deptno);
dummy := EXEC_SQL.EXECUTE(source_connid,source_cursor);
-- prepare the cursor to insert into destination database
destination_cursor := EXEC_SQL.OPEN_CURSOR(destination_connid);
EXEC_SQL.PARSE(destination_connid,destination_cursor,'INSERT INTO ' ||:dest_tab ||
'(empno,ename,deptno) VALUES (:empno,:ename,:deptno)');
LOOP
-- fetch rows from source database
IF EXEC_SQL.FETCH_ROWS(source_connid,source_cursor) > 0 THEN
-- get column values for this row
EXEC_SQL.COLUMN_VALUE(source_connid,source_cursor,1, empno);
EXEC_SQL.COLUMN_VALUE(source_connid,source_cursor,2, ename);
EXEC_SQL.COLUMN_VALUE(source_connid,source_cursor,3, deptno);
-- bind the column values into the cursor that inserts into destination database
EXEC_SQL.BIND_VARIABLE(destination_connid,destination_cursor, ':empno', empno);
EXEC_SQL.BIND_VARIABLE(destination_connid,destination_cursor, ':ename', ename);
EXEC_SQL.BIND_VARIABLE(destination_connid,destination_cursor, ':deptno', deptno);
dummy := EXEC_SQL.EXECUTE(destination_connid,destination_cursor);
ELSE
EXIT;
END IF;
END LOOP;
-- commit transaction in destination database
EXEC_SQL.PARSE(destination_connid,destination_cursor,'commit');
dummy := EXEC_SQL.EXECUTE(destination_connid,destination_cursor);
-- close cursors and connections
EXEC_SQL.CLOSE_CURSOR(destination_connid,destination_cursor);
EXEC_SQL.CLOSE_CURSOR(source_connid, source_cursor);
EXEC_SQL.CLOSE_CONNECTION(destination_connid);
EXEC_SQL.CLOSE_CONNECTION(source_connid);
MESSAGE('Done!');
EXCEPTION
-- handle errors raised by the exec_sql package
WHEN EXEC_SQL.PACKAGE_ERROR THEN
IF EXEC_SQL.LAST_ERROR_CODE(source_connid) != 0 THEN
TEXT_IO.PUT_LINE('ERROR (source: ' ||
TO_CHAR(EXEC_SQL.LAST_ERROR_CODE(source_connid))|| '): ' ||EXEC_SQL.LAST_ERROR_MESG(source_connid));
END IF;
IF EXEC_SQL.LAST_ERROR_CODE(destination_connid) != 0 THEN
TEXT_IO.PUT_LINE('ERROR (destination: ' ||
TO_CHAR(EXEC_SQL.LAST_ERROR_CODE(destination_connid))|| '): ' ||EXEC_SQL.LAST_ERROR_MESG(destination_connid));
END IF;
IF EXEC_SQL.IS_CONNECTED(destination_connid) THEN
IF EXEC_SQL.IS_OPEN(destination_connid,destination_cursor) THEN
EXEC_SQL.CLOSE_CURSOR(destination_connid,destination_cursor);
END IF;
EXEC_SQL.CLOSE_CONNECTION(destination_connid);
END IF;
IF EXEC_SQL.IS_CONNECTED(source_connid) THEN
IF EXEC_SQL.IS_OPEN(source_connid,source_cursor) THEN
EXEC_SQL.CLOSE_CURSOR(source_connid,source_cursor);
END IF;
EXEC_SQL.CLOSE_CONNECTION(source_connid);
END IF;
END; |
Partager