检查 table 重复项的过程 - Oracle PL/SQL

Procedure to check table for duplicates - Oracle PL/SQL

总的来说 SQL 很陌生。

看过一些关于如何在 PL/SQL 中将 table 声明为变量的示例,但是,其中 none 似乎满足了我的需要。

程序很简单,检查table中是否有重复的唯一编号,例如:

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

我想创建一个可以调用并动态更改 the _nameunique_id.

的过程

类似于:

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;
/

如果你想在运行时改变 table,你需要动态 SQL 这意味着你需要 assemble SQL 声明你想要一个字符串变量并执行该字符串。如果您有过程,则需要该过程对查询结果进行处理。我的猜测是你想要 return 一个游标。

请注意,我没有做任何事情来验证 table 和列名以避免 SQL 注入攻击。您可能希望使用 dbms_assert 来验证输入而不是盲目信任调用者。

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;