You are on page 1of 2

CREATE OR REPLACE PROCEDURE ram.

p_create_tb_copy (IN source_db VARCHAR(30), IN source_tb VARCHAR(30), IN target_db VARCHAR(30), IN target_tb VARCHAR(30), IN with_data CHAR(1), IN WITH_STATS CHAR(1), IN WITH_NPI CHAR(1), OUT status VARCHAR(2000 ) ) BEGIN DECLARE CNT SMALLINT; DECLARE SQL_TEXT VARCHAR(10000); SELECT COUNT(*) INTO :cnt FROM dbc.indices WHERE databasename = :source_db AND tablename = :source_tb AND columnposition = 1 AND indextype = 'S' ; IF ( cnt = 0 ) THEN BEGIN SET SQL_TEXT = 'Create table ' !! target_db !! '.' !! target _tb !! ' as ' !! source_db !! '.' !! source_tb !! ' WITH ' !! CASE WHEN with_dat a = 'N' THEN ' NO ' ELSE ' ' END !! 'DATA ' !! CASE WHEN WITH_STATS = 'Y' THEN ' AND STATISTICS' ELSE '' END !! CASE WHEN WITH_NPI = 'Y' THEN 'NO PRIMARY INDEX' ELSE '' END ; CALL DBC.SYSEXECSQL( :SQL_TEXT); SET status = 'NO INDEX' !! SQL_TEXT; END; ELSE BEGIN SET SQL_TEXT = 'Create table ' !! target_db !! '.' !! target_tb !! ' as ' !! source_db !! '.' !! source_tb !! ' WITH NO DATA ' !! CASE WHEN WIT H_STATS = 'Y' THEN 'AND STATISTICS' ELSE '' END !! CASE WHEN WITH_NPI = 'Y' THEN 'NO PRIMARY INDEX' ELSE '' END ; CALL DBC.SYSEXECSQL( :SQL_TEXT); SET status = 'NO INDEX' !! SQL_TEXT; SET SQL_TEXT = 'delete from test_db_uli.gt_drop_index_stmt '; CALL DBC.SYSEXECSQL( :SQL_TEXT); SET SQL_TEXT = ' insert into test_db_uli.gt_drop_index_stmt WITH RECURSIVE base (databasename, tablename, indexnumber, colu mnname, columnposition) AS ( SELECT databasename, tablename, indexnumber, CAST(columnname AS VARCHAR(1000)), columnposition FROM DBC.Indices WHERE columnposition = 1

AND INDEXTYPE = ''s'' UNION ALL SELECT i.databasename, i.tablename, i.indexnumber, b.columnname !! '','' !! TRIM(i.columnname), i.columnposition FROM DBC.Indices i JOIN base b ON b.databasename = i.databasename AND b.tablename = i.tablename AND b.indexnumber = i.indexnumber AND b.columnposition + 1 = i.columnposition ) SELECT ''DROP INDEX ('' !! columnname !! '') ON '!! target_d b !! '.' !! target_tb !! ';'' AS txt FROM base WHERE databasename = ''' !! source_db !! ''' AND tablename = ''' !! source_tb !! ''' QUALIFY columnposition = MAX(columnposition) OVER (PARTITION BY databasename, tablename, indexnumber) '; CALL DBC.SYSEXECSQL( :SQL_TEXT); FOR STCURSOR AS RESULTSET CURSOR FOR SELECT TXT FROM test_db_uli.gt_drop_index_stmt DO BEGIN SET SQL_TEXT = STCURSOR.txt; CALL DBC.SYSEXECSQL( :SQL_TEXT); END; END FOR; IF ( with_data = 'Y' ) THEN BEGIN SET SQL_TEXT = 'INSERT INTO '!! target_db !! '.' !! target_tb !! ' select * from ' !! source_db !! '.' !! source_tb; CALL DBC.SYSEXECSQL( :SQL_TEXT); END; END IF; SET status = 'with index ' !! SQL_TEXT; END; END IF; END;

You might also like