Daily quizzes provided by www.plsqlchallenge.com are the right way to learn PL/SQL language, to know about many features, tips and trics. The site also allows to communicate with developers and learn the best practices.
PL/SQL Challenge suggested interesting task yesterday - to develop code "to compare row counts of all tables in two schema and display the names and counts of the tables where there is a disagreement." PL/SQL and SQL are both possible. I prefered PL/SQL way and tried to play around with nested tables and multiset operations. The procedure is shown below.
PL/SQL Challenge suggested interesting task yesterday - to develop code "to compare row counts of all tables in two schema and display the names and counts of the tables where there is a disagreement." PL/SQL and SQL are both possible. I prefered PL/SQL way and tried to play around with nested tables and multiset operations. The procedure is shown below.
CREATE OR REPLACE PROCEDURE compare_table_counts( schema1_in IN VARCHAR2, schema2_in IN VARCHAR2, filter_in IN VARCHAR2) IS TYPE type_aat IS TABLE OF VARCHAR2(100); tab_list_1 type_aat; tab_list_2 type_aat; tab_except type_aat; PROCEDURE make_tab_list( loc_tab IN OUT type_aat,schema_name IN VARCHAR2 ) IS sql_stmt VARCHAR2(200); loc_cnt PLS_INTEGER; BEGIN SELECT table_name BULK COLLECT INTO loc_tab FROM all_tables WHERE owner = schema_name AND table_name LIKE filter_in; FOR indx IN loc_tab.FIRST..loc_tab.LAST LOOP sql_stmt := 'SELECT COUNT(*) FROM '|| schema_name||'.'|| loc_tab(indx); EXECUTE IMMEDIATE sql_stmt INTO loc_cnt; loc_tab(indx) := loc_tab(indx) || ' (' || loc_cnt || ')'; END LOOP; END; PROCEDURE show_disagreement( schema_name IN VARCHAR2, loc_tab IN type_aat ) IS BEGIN DBMS_OUTPUT.PUT_LINE('In schema '||schema_name|| ' differing tables...'); DBMS_OUTPUT.PUT_LINE('(Row counts in parentheses)'); FOR indx IN loc_tab.FIRST..loc_tab.LAST LOOP DBMS_OUTPUT.PUT_LINE(' ' || loc_tab(indx)); END LOOP; END; BEGIN make_tab_list(tab_list_1,schema1_in); make_tab_list(tab_list_2,schema2_in); tab_except := tab_list_1 MULTISET EXCEPT tab_list_2; IF tab_except.COUNT > 0 THEN show_disagreement(schema1_in,tab_except); END IF; tab_except := tab_list_2 MULTISET EXCEPT tab_list_1; IF tab_except.COUNT > 0 THEN show_disagreement(schema2_in,tab_except); END IF; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE); DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM); END;
No comments:
Post a Comment