Thursday, 24 October 2019

Script to copy table data from one schema to other schema

#!/bin/ksh

# Title:       CopyData.sh
# Description: Script to copy table data from one schema to other schema 
# Date         Author              Description
# ------------ ------------------- -----------------------------------------

DBSCRIPT=`basename $0`; export DBSCRIPT
HOSTNAME=`hostname`; export HOSTNAME

. ReadConfig.sh

if [ -n "${SRC_DB_SERVER}" ] && [ -n "${SRC_DB_NAME}" ] && [ -n "${SRC_SCHEMA}" ] &&  [ -n "${SRC_SCHEMAPWD}" ] && [ -n "${TGT_SCHEMA}" ] && [ -n "${TGT_SCHEMAPWD}" ]; then
SOURCE_SERVICE_NAME="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=${SRC_DB_SERVER})(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=${SRC_DB_NAME})))"; export SOURCE_SERVICE_NAME
TGT_SERVICE_NAME="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=${TGT_DB_SERVER})(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=${TGT_DB_NAME})))"
CONNECT_STRING="${TGT_SCHEMA}"/"${TGT_SCHEMAPWD}"@"${TGT_SERVICE_NAME}"; export CONNECT_STRING
else
echo "Please rerun script by providing all values in file Config.txt"
exit 3
fi

config_db() {
$ORACLE_HOME/bin/sqlplus ${CONNECT_STRING} << EOF
CREATE DATABASE LINK ${SRC_DB_NAME} CONNECT TO ${SRC_SCHEMA} IDENTIFIED BY ${SRC_SCHEMAPWD} USING '${SOURCE_SERVICE_NAME}';
SET SERVEROUTPUT ON
BEGIN
FOR rec_part IN (
SELECT PARTITION_NAME,HIGH_VALUE
FROM USER_TAB_PARTITIONS@${SRC_DB_NAME}
WHERE TABLE_NAME=UPPER('${TGT_TABLE_NAME}')
ORDER BY 1
)
LOOP
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE ${TGT_TABLE_NAME} ADD PARTITION '||rec_part.PARTITION_NAME||' VALUES ('||rec_part.HIGH_VALUE||')';
DBMS_OUTPUT.PUT_LINE ('${TGT_TABLE_NAME}: Partition '||rec_part.PARTITION_NAME||' created in target schema ${TGT_SCHEMA} !!!');
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE ('${TGT_TABLE_NAME}: Partition '||rec_part.PARTITION_NAME||' already exists!!!');
END;
END LOOP;
END;
/
EOF
}

copy_data() {
$ORACLE_HOME/bin/sqlplus ${CONNECT_STRING} << EOF
INSERT INTO ${TGT_TABLE_NAME}
SELECT * FROM ${SRC_TABLE_NAME}@${SRC_DB_NAME} WHERE ROWNUM <= ${ROWS};
DROP DATABASE LINK ${SRC_DB_NAME};
EOF
}

hard_copy_data() {
$ORACLE_HOME/bin/sqlplus ${CONNECT_STRING} << EOF
@CopyData.sql ${SRC_DB_NAME}
DROP DATABASE LINK ${SRC_DB_NAME};
EOF
}

config_db

if [ "${ROWS}" = "*" ]; then
ROWS="10000000000000000000"; export ROWS
fi

if [ "${ALL_COLUMNS}" = "*" ]; then
copy_data
else
hard_copy_data 
fi
exit

No comments:

Post a Comment