Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

How to used single nested table for two tables

MAhmadAug 22 2023

Hi Experts,
I am searching Tab, Line Feed and Carriage Return in columns in table TBL_OUT_CUST and TBL_OUT_CUST_EXT.
Currently using two nested tables and got the correct output but requirement use only single nested table.

How can use a single nested table in place of two?

     TYPE t_tab_data_type IS TABLE OF TBL_OUT_CUST%ROWTYPE;
       t_tab_data         t_tab_data_type;
     TYPE t_tab_data_type_ext IS TABLE OF TBL_OUT_CUST_EXT%ROWTYPE;
       t_tab_data_ext         t_tab_data_type_ext;

Pleas help to resolve the problem. Thanks

create or replace PROCEDURE USP_SEARCH_TABS_NEWLINES_ORA (inTabName VARCHAR2 DEFAULT 'TBL_OUT_CUST') AS

  --Search Tab, Line Feed and Carriage Return in table TBL_OUT_CUSTOMERS and TBL_OUT_CUSTOMER_EXTENSIONS

        TYPE t_tab_data_type IS TABLE OF TBL_OUT_CUST%ROWTYPE;
        t_tab_data 		t_tab_data_type;

        TYPE t_tab_data_type_ext IS TABLE OF TBL_OUT_CUST_EXT%ROWTYPE;
        t_tab_data_ext 		t_tab_data_type_ext;

        v_count 		NUMBER(38):= 0;
        v_colname 		VARCHAR2(50);
        v_BatchDate 	VARCHAR2(10);

		v_SQLStr 	    VARCHAR2(30000);
		v_SQLData 	    VARCHAR2(30000);
		v_ColData 	    VARCHAR2(30000);
    BEGIN       
        v_SQLStr:='';
        v_SQLData:='';
        v_ColData:='';

   IF inTabName  = 'TBL_OUT_CUST' THEN
        FOR col IN (
                    SELECT ETL_TBL_NAME, COL_NAME as column_name 
					FROM TBL_MAPPING
					WHERE TBL_NAME = 'CUSTOMERS' 
					AND HANDLING_REQUIRED = 'Y'
                    ) LOOP
            v_colname:=col.column_name;
            v_SQLStr:='SELECT * FROM ' || col.ETL_TBL_NAME || ' WHERE (instr(' || col.column_name || ', CHR(9))<>0 or instr(' || col.column_name || ', CHR(10))<>0 or instr(' || col.column_name || ', CHR(13))<>0)';
            EXECUTE IMMEDIATE v_SQLStr
            BULK COLLECT INTO t_tab_data;
            IF t_tab_data.COUNT > 0 THEN
                v_count:=t_tab_data.COUNT;
                FOR i IN 1..t_tab_data.COUNT LOOP
                v_SQLData:='SELECT '||col.column_name||' FROM ' || col.ETL_TBL_NAME ||' WHERE CUST_UNIQUE_ID = '''||t_tab_data(i).CUST_UNIQUE_ID||'''';  
                    EXECUTE IMMEDIATE v_SQLData INTO v_ColData;
                    insert into TBL_PATCH (CUSTOMER_ID, COL_NAME, COL_DATA,ETL_TBL_NAME)
                   values (t_tab_data(i).CUST_UNIQUE_ID, col.column_name, v_ColData, inTabName);
                    END LOOP;
                commit;
            END IF;
        END LOOP;
    ELSIF inTabName  = 'TBL_OUT_CUST_EXT' THEN
          FOR col IN (
                    SELECT ETL_TBL_NAME, COL_NAME as column_name 
					FROM TBL_MAPPING
					WHERE TBL_NAME = 'CUSTOMERS_EXT' 
					AND HANDLING_REQUIRED = 'Y'
                    ) LOOP
            v_colname:=col.column_name;
            v_SQLStr:='SELECT * FROM ' || col.ETL_TBL_NAME || ' WHERE (instr(' || col.column_name || ', CHR(9))<>0 or instr(' || col.column_name || ', CHR(10))<>0 or instr(' || col.column_name || ', CHR(13))<>0)';
            EXECUTE IMMEDIATE v_SQLStr
            BULK COLLECT INTO t_tab_data_ext;
            IF t_tab_data_ext.COUNT > 0 THEN
                v_count:=t_tab_data_ext.COUNT;
                FOR i IN 1..t_tab_data_ext.COUNT LOOP
                v_SQLData:='SELECT '||col.column_name||' FROM ' || col.ETL_TBL_NAME ||' WHERE CUST_UNIQUE_ID = '''||t_tab_data_ext(i).CUST_UNIQUE_ID||'''';
                    EXECUTE IMMEDIATE v_SQLData INTO v_ColData;
                    insert into TBL_PATCH (CUSTOMER_ID, COL_NAME, COL_DATA,ETL_TBL_NAME)
                   values (t_tab_data_ext(i).CUST_UNIQUE_ID, col.column_name, v_ColData, inTabName);
                    END LOOP;
                commit;
            END IF;
        END LOOP;
    ELSE 
        DBMS_OUTPUT.PUT_LINE ('Wrong Parameter');
    END IF;
END USP_SEARCH_TABS_NEWLINES_ORA;
Create table script and data
CREATE TABLE TBL_OUT_CUST (CUST_UNIQUE_ID,CUST_NAME,CUST_ADD) AS
SELECT 'ID123','JOHN'||chr(9)||'JONNY','SEOUL' FROM DUAL UNION ALL
SELECT 'ID345','SAM PETTER','LONDON' FROM DUAL UNION ALL
SELECT 'ID678','SCOTT','NEW'||chr(10)||'YARK' FROM DUAL;

CREATE TABLE TBL_OUT_CUST_EXT (CUST_UNIQUE_ID,CONTACT_NO, EMAIL_ID,CITY,COUNTRY) AS
SELECT 'EXT123',1234567890,'abc@gmail.'||chr(9)||'com','TOKYO','JAPAN' FROM DUAL UNION ALL
SELECT 'EXT345',2345678901,'sampetter@yahoo.com','KUALA LUMPUE','MALAYSIA' FROM DUAL UNION ALL
SELECT 'EXT678',3456789012,'scott@gmail.com','NEW'||chr(10)||'WELLINGTON','NEW'||CHR(13)||'ZEALAND' FROM DUAL;

CREATE TABLE TBL_MAPPING (TBL_NAME,COL_NAME,HANDLING_REQUIRED,ETL_TBL_NAME) AS
SELECT 'CUSTOMERS','CUST_UNIQUE_ID','Y','TBL_OUT_CUST' FROM DUAL UNION ALL
SELECT 'CUSTOMERS','CUST_NAME','Y','TBL_OUT_CUST' FROM DUAL UNION ALL
SELECT 'CUSTOMERS','CUST_ADD','Y','TBL_OUT_CUST' FROM DUAL UNION ALL
SELECT 'CUSTOMERS_EXT','CUST_UNIQUE_ID','Y','TBL_OUT_CUST_EXT' FROM DUAL UNION ALL
SELECT 'CUSTOMERS_EXT','CONTACT_NO','Y','TBL_OUT_CUST_EXT' FROM DUAL UNION ALL
SELECT 'CUSTOMERS_EXT','EMAIL_ID','Y','TBL_OUT_CUST_EXT' FROM DUAL UNION ALL
SELECT 'CUSTOMERS_EXT','CITY','Y','TBL_OUT_CUST_EXT' FROM DUAL UNION ALL
SELECT 'CUSTOMERS_EXT','COUNTRY','Y','TBL_OUT_CUST_EXT' FROM DUAL;

CREATE TABLE TBL_PATCH (CUSTOMER_ID VARCHAR2(50 CHAR), COL_NAME VARCHAR2(50 CHAR), COL_DATA VARCHAR2(1000 CHAR),ETL_TBL_NAME VARCHAR2(40 CHAR));

Execute procedure:
EXEC USP_SEARCH_TABS_NEWLINES_ORA('TBL_OUT_CUST');
EXEC USP_SEARCH_TABS_NEWLINES_ORA('TBL_OUT_CUST_EXT');

Output screenshot below:
SELECT * FROM TBL_PATCH;

Comments
Post Details
Added on Aug 22 2023
2 comments
207 views