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;
