- 论坛徽章:
- 0
|
1.第一版
- CREATE OR REPLACE PROCEDURE comparetable
- IS
- --SQL
- sqlStr VARCHAR2(2000);
- updateColm VARCHAR2(2000);
- cnt1 NUMBER;
- cnt2 NUMBER;
- --deleteColm VARCHAR2(2000);
- --
- rsTable_1 SYS_REFCURSOR; --新
- rsTable SYS_REFCURSOR; --旧
- --
- recTable_1 Table_1%ROWTYPE; --新
- recTable Table%ROWTYPE; --旧
- BEGIN
- --新
- sqlStr := '';
- sqlStr := sqlStr || 'SELECT ';
- sqlStr := sqlStr || ' * ';
- sqlStr := sqlStr || 'FROM ';
- sqlStr := sqlStr || ' Table_1';
- --
- recTable_1 := NULL;
- OPEN rsTable_1 FOR sqlStr;
- LOOP FETCH rsTable_1 INTO recTable_1;
- EXIT WHEN rsTable_1%NOTFOUND;
-
- SELECT COUNT(*) INTO cnt2 FROM Table b WHERE b.prod_no = recTable_1.PROD_NO;
- IF cnt2 = 0 THEN
- DBMS_OUTPUT.PUT_LINE('NEW' || 'ADD;' || recTable_1.PROD_NO || ',' || recTable_1.Prod_Nm || ',' ||
- recTable_1.Prod_Plan_Purpose || ',' ||
- recTable_1.Prod_Cnt_No);
- END IF;
-
- --旧
- sqlStr := '';
- sqlStr := sqlStr || 'SELECT ';
- sqlStr := sqlStr || ' * ';
- sqlStr := sqlStr || 'FROM ';
- sqlStr := sqlStr || ' Table b where b.prod_no = ''';
- sqlStr := sqlStr || recTable_1.PROD_NO;
- sqlStr := sqlStr || '''';
- --
- recTable := NULL;
-
- OPEN rsTable FOR sqlStr;
- LOOP FETCH rsTable INTO recTable;
- EXIT WHEN rsTable%NOTFOUND;
-
- updateColm := '';
-
- IF recTable.Prod_Nm <> recTable_1.Prod_Nm THEN
- updateColm := updateColm || 'Prod_Nm;';
- END IF;
-
- IF(NOT (recTable.Prod_Plan_Purpose IS NULL AND recTable_1.Prod_Plan_Purpose IS NULL OR recTable.Prod_Plan_Purpose IS NOT NULL AND recTable_1.Prod_Plan_Purpose IS NOT NULL AND recTable.Prod_Plan_Purpose = recTable_1.Prod_Plan_Purpose)) THEN
- updateColm := updateColm || 'Prod_Plan_Purpose;';
- END IF;
-
- /* IF recTable.Prod_Plan_Purpose <> recTable_1.Prod_Plan_Purpose THEN
- updateColm := updateColm || 'Prod_Plan_Purpose;';
- END IF;*/
-
- IF recTable.Prod_Cnt_No <> recTable_1.Prod_Cnt_No THEN
- updateColm := updateColm || 'Prod_Cnt_No;';
- END IF;
-
- END LOOP;
- CLOSE rsTable;
- END LOOP;
- CLOSE rsTable_1;
- IF updateColm IS NOT NULL THEN
- DBMS_OUTPUT.PUT_LINE('Old' || updateColm || recTable.PROD_NO || ',' || recTable.Prod_Nm || ',' ||
- recTable.Prod_Plan_Purpose || ',' ||
- recTable.Prod_Cnt_No);
- DBMS_OUTPUT.PUT_LINE('New' || updateColm || recTable.PROD_NO || ',' || recTable_1.Prod_Nm || ',' ||
- recTable_1.Prod_Plan_Purpose || ',' ||
- recTable_1.Prod_Cnt_No);
- END IF;
- --旧
- sqlStr := '';
- sqlStr := sqlStr || 'SELECT ';
- sqlStr := sqlStr || ' * ';
- sqlStr := sqlStr || 'FROM ';
- sqlStr := sqlStr || ' Table';
- --
- recTable := NULL;
- OPEN rsTable FOR sqlStr;
- LOOP FETCH rsTable INTO recTable;
- EXIT WHEN rsTable%NOTFOUND;
-
- --新
- SELECT COUNT(*) INTO cnt1 FROM Table_1 b WHERE b.prod_no = recTable.PROD_NO;
-
- IF cnt1 = 0 THEN
- DBMS_OUTPUT.PUT_LINE('Old' || 'DELETE;' || recTable.PROD_NO || ',' || recTable.Prod_Nm || ',' ||
- recTable.Prod_Plan_Purpose || ',' ||
- recTable.Prod_Cnt_No);
- END IF;
-
- END LOOP;
- CLOSE rsTable;
-
- END;
2.改造后
- CREATE OR REPLACE PROCEDURE autocomparetable(tableName IN CHAR)
- IS
- strTemp VARCHAR2(8000);
- selectTemp VARCHAR2(8000);
- whereTemp VARCHAR2(200);
- compareTemp VARCHAR2(200);
- compareOldTemp VARCHAR2(200);
- --
- TYPE colmPk IS RECORD(
- COLUMN_NAME CHAR(40),
- PK CHAR(20));
- TYPE arrayColmPk IS TABLE OF colmPk INDEX BY BINARY_INTEGER;
- arrayColmPkTemp arrayColmPk;
- BEGIN
- --
- SELECT
- COL.COLUMN_NAME ,
- NVL2(CONS.COLUMN_NAME, '1', NULL) PK
- BULK COLLECT INTO arrayColmPkTemp
- FROM USER_TAB_COLUMNS COL
- LEFT JOIN (SELECT CONCOL.TABLE_NAME, CONCOL.COLUMN_NAME
- FROM USER_CONS_COLUMNS CONCOL
- INNER JOIN USER_CONSTRAINTS CON
- ON CON.OWNER = CONCOL.OWNER
- AND CON.CONSTRAINT_NAME = CONCOL.CONSTRAINT_NAME
- AND CON.CONSTRAINT_TYPE = 'P'
- ) CONS
- ON CONS.TABLE_NAME = COL.TABLE_NAME
- AND CONS.COLUMN_NAME = COL.COLUMN_NAME
- WHERE COL.TABLE_NAME ='TABLENAME'
- ORDER BY COL.COLUMN_ID;
- --
- strTemp := '';
- selectTemp := 'DATETYPE,';
- whereTemp := 'WHERE ';
- compareTemp := '';
- compareOldTemp := '';
- FOR i IN 1 .. arrayColmPkTemp.count LOOP
- IF i = arrayColmPkTemp.count THEN
- strTemp := strTemp || arrayColmPkTemp(i).COLUMN_NAME || 'TABLENAME.' || arrayColmPkTemp(i).COLUMN_NAME || '%TYPE);';
- selectTemp := selectTemp ||arrayColmPkTemp(i).COLUMN_NAME;
- ELSE
- strTemp := strTemp || arrayColmPkTemp(i).COLUMN_NAME || 'TABLENAME.' || arrayColmPkTemp(i).COLUMN_NAME || '%TYPE,';
- selectTemp := selectTemp ||arrayColmPkTemp(i).COLUMN_NAME || ',';
- END IF;
-
- IF arrayColmPkTemp(i).PK IS NOT NULL THEN
- IF i = 1 THEN
- whereTemp := whereTemp || arrayColmPkTemp(i).COLUMN_NAME || ' = ' || 'arrayUpdtRecordTemp(i).' || arrayColmPkTemp(i).COLUMN_NAME;
- ELSE
- whereTemp := whereTemp || ' AND ' || arrayColmPkTemp(i).COLUMN_NAME || ' = ' || 'arrayUpdtRecordTemp(i).' || arrayColmPkTemp(i).COLUMN_NAME;
- END IF;
- ELSE
- compareTemp := compareTemp
- || 'IF (NOT (oldTableColmTemp(1).' || arrayColmPkTemp(i).COLUMN_NAME || ' IS NULL AND '
- || ' arrayUpdtRecordTemp(i).' || arrayColmPkTemp(i).COLUMN_NAME || ' IS NULL OR '
- || ' oldTableColmTemp(1).' || arrayColmPkTemp(i).COLUMN_NAME || ' IS NOT NULL AND '
- || ' arrayUpdtRecordTemp(i).' || arrayColmPkTemp(i).COLUMN_NAME || ' IS NOT NULL AND '
- || ' oldTableColmTemp(1).' || arrayColmPkTemp(i).COLUMN_NAME || ' = arrayUpdtRecordTemp(i). ' || arrayColmPkTemp(i).COLUMN_NAME || ' )) THEN '
- || ' DBMS_OUTPUT.PUT_LINE('' OLDTABLE-UPDATERECORD; ''' || ''' arrayColmPkTemp(i).COLUMN_NAME; ''' || 'arrayUpdtRecordTemp(i).' || arrayColmPkTemp(i).COLUMN_NAME || ');'
- || ' END IF; ';
-
- compareOldTemp := compareOldTemp
- || 'IF (NOT (newTableColmTemp(1).' || arrayColmPkTemp(i).COLUMN_NAME || ' IS NULL AND '
- || ' arrayUpdtRecordTemp(i).' || arrayColmPkTemp(i).COLUMN_NAME || ' IS NULL OR '
- || ' newTableColmTemp(1).' || arrayColmPkTemp(i).COLUMN_NAME || ' IS NOT NULL AND '
- || ' arrayUpdtRecordTemp(i).' || arrayColmPkTemp(i).COLUMN_NAME || ' IS NOT NULL AND '
- || ' newTableColmTemp(1).' || arrayColmPkTemp(i).COLUMN_NAME || ' = arrayUpdtRecordTemp(i). ' || arrayColmPkTemp(i).COLUMN_NAME || ' )) THEN '
- || ' DBMS_OUTPUT.PUT_LINE('' NEWTABLE-UPDATERECORD; ''' || ''' arrayColmPkTemp(i).COLUMN_NAME; ''' || 'arrayUpdtRecordTemp(i).' || arrayColmPkTemp(i).COLUMN_NAME || ');'
- || ' END IF; ';
- END IF;
- END LOOP;
- EXECUTE IMMEDIATE
- '
- DECLARE
- --
- TYPE colmPk IS RECORD(
- COLUMN_NAME CHAR(40),
- PK CHAR(20));
- TYPE arrayColmPk IS TABLE OF colmPk INDEX BY BINARY_INTEGER;
- arrayColmPkTemp arrayColmPk;
- --
- TYPE updtRecord IS RECORD(
- DATETYPE CHAR(3),' || strTemp || '
- TYPE arrayUpdtRecord IS TABLE OF
- updtRecord INDEX BY BINARY_INTEGER;
- arrayUpdtRecordTemp arrayUpdtRecord;
- TYPE tableColm IS RECORD( ' || strTemp || '
- TYPE oldTableColm IS TABLE OF
- tableColm INDEX BY BINARY_INTEGER;
- oldTableColmTemp oldTableColm;
- TYPE newTableColm IS TABLE OF
- tableColm INDEX BY BINARY_INTEGER;
- newTableColmTemp newTableColm;
- BEGIN
- --
- SELECT ' || selectTemp || '
- BULK COLLECT INTO arrayUpdtRecordTemp
- FROM (SELECT ' || '''' || 'NEW' || '''' ||
- ' DATETYPE, NEWTABLE.*
- FROM TABLENAME_1 NEWTABLE
- MINUS
- SELECT ' || '''' || 'NEW' || '''' ||
- ' DATETYPE, OLDTABLE.*
- FROM TABLENAME OLDTABLE
- UNION
- SELECT ' || '''' || 'OLD' || '''' ||
- ' DATETYPE, OLDTABLE.*
- FROM TABLENAME OLDTABLE
- MINUS
- SELECT ' || '''' || 'OLD' || '''' ||
- ' DATETYPE, NEWTABLE.* FROM TABLENAME_1 NEWTABLE)
- ORDER BY PROD_NO;
- --
- FOR i IN 1 .. arrayUpdtRecordTemp.count LOOP
- IF (arrayUpdtRecordTemp(i).DATETYPE = ''NEW'') THEN
- --
- SELECT * BULK COLLECT INTO oldTableColmTemp FROM TABLENAME ' || whereTemp || ';' || '
- IF oldTableColmTemp.count = 0 THEN
- --
- DBMS_OUTPUT.PUT_LINE('' OLDTABLE-ADDRECORD; '' || arrayUpdtRecordTemp(i).PROD_NO);
- ELSE '
-
- || compareTemp || '
- END IF;
- ELSE
- --
- SELECT * BULK COLLECT INTO newTableColmTemp FROM TABLENAME_1 ' || whereTemp || ';' || '
- IF newTableColmTemp.count = 0 THEN
- --
- DBMS_OUTPUT.PUT_LINE('' NEWTABLE-DELETERECORD; '' || arrayUpdtRecordTemp(i).PROD_NO);
- ELSE '
-
- || compareOldTemp || '
- END IF;
- END IF;
- END LOOP;
- END;
- ';
- END;
- /
|
|