Search code examples
oracleplsqlplsqldeveloper

Procedure to check table for duplicates - Oracle PL/SQL


Very new to SQL in general.

Have seen a few examples on how to declare table as variable in PL/SQL, however, none of them seem to do what I need.

The procedure is quite simple, check for duplicate unique numbers in a table, eg:

select unique_id,
       count(unique_id) as count_unique
  from table_name
having count(unique_id)>1
 group by unique_id 

I would like to create a procedure that can be called and dynamically change the _name and the unique_id.

Something like:

declare 
  table_name is table:= table_1
  unique_id varchar2(100):= unique_1
begin
  select unique_id,
         count(unique_id) as count_unique
    from table_name
  having count(unique_id)>1
   group by unique_id 
end;
/

Solution

  • If you want to change the table at runtime, you'd need dynamic SQL which means that you'd need to assemble the SQL statement you want in a string variable and execute that string. If you have a procedure, you'd need that procedure to do something with the results of the query. My guess is that you want to return a cursor.

    Note that I'm not doing anything to validate the table and column names to avoid SQL injection attacks. You'd probably want to use dbms_assert to validate the input rather than blindly trusting the caller.

    create or replace procedure get_duplicates( p_table_name  in varchar2,
                                                p_column_name in varchar2,
                                                p_rc         out sys_refcursor )
    as
      l_sql varchar2(1000);
    begin
      l_sql := '  select ' || p_column_name || ', ' ||
               '         count(' || p_column_name || ') as unique_count ' ||
               '    from ' || p_table_name ||
               '   group by ' || p_column_name ||
               '  having count(' || p_column_name || ') > 1';
      dbms_output.put_line( l_sql );
      open p_rc for l_sql;
    end;