Hi Bilal,
As you are deleting the element of the collection prior the visit of the loop so it find the element as null so it raises exception.
WorkAround is that create another collection and delete items from that and wrap the second loop within BEGIN and EXCEPTION, END so that the outer loop continues.
Let me know if you find any trouble.
Code:
/* Formatted on 21/05/2010 09:13:08 (QP5 v5.115.810.9015) */
DECLARE
TYPE typ_name IS TABLE OF emp%ROWTYPE;
tmp_emp typ_name;
tmp_emp2 typ_name;
match_count PLS_INTEGER := 0;
errors PLS_INTEGER;
dml_errors EXCEPTION;
PRAGMA EXCEPTION_INIT (dml_errors, -24381);
str VARCHAR2 (100);
x number;
BEGIN
SELECT *
BULK COLLECT
INTO tmp_emp
FROM emp
ORDER BY ename;
SELECT *
BULK COLLECT
INTO tmp_emp2
FROM emp
ORDER BY ename;
x:=tmp_emp.count;
FOR i IN 1 .. tmp_emp.LAST
LOOP
begin
FOR j IN i + 1 .. tmp_emp2.COUNT
LOOP
match_count := 0;
IF utl_match.edit_distance_similarity (tmp_emp (i).ename,
tmp_emp (j).ename) > 50
THEN --used 50% ,change it.
match_count := match_count + 1;
END IF;
IF match_count >= 1
THEN -- if 3 cols are >50%, change it as per need.
DBMS_OUTPUT.put_line (
tmp_emp (i).ename || ' is like ' || tmp_emp (j).ename
);
--you can place your delete statement here to dele from original table.
str := tmp_emp (j).ename;
tmp_emp.delete(j);
DBMS_OUTPUT.put_line ('Deleting :' || str);
END IF;
END LOOP;
exception
when no_data_found then
DBMS_OUTPUT.put_line (sqlerrm);
end;
END LOOP;
DBMS_OUTPUT.new_line;
DBMS_OUTPUT.put_line ('****************************');
DBMS_OUTPUT.put_line ('Printing Remaing Records');
DBMS_OUTPUT.put_line ('****************************');
FOR i IN 1 .. tmp_emp.COUNT
LOOP
IF tmp_emp.EXISTS (i)
THEN
DBMS_OUTPUT.put_line (tmp_emp2 (i).ename);
END IF;
END LOOP;
DBMS_OUTPUT.put_line ('---------------------------');
EXCEPTION
WHEN OTHERS
THEN
RAISE;
END;
JAMES is like JONES
Deleting :JONESORA-01403: no data found
****************************
Printing Remaing Records
****************************
ADAMS
ALLEN
BLAKE
CLARK
FORD
JAMES
KING
MARTIN
MILLER
SCOTT
SMITH
TURNER
---------------------------
No JONES in the list
