检查表是否存在重复项的过程-Oracle PL/SQL

检查表是否存在重复项的过程-Oracle PL/SQL,oracle,plsql,plsqldeveloper,Oracle,Plsql,Plsqldeveloper,一般来说,SQL非常新 我已经看到了一些关于如何在PL/SQL中将表声明为变量的示例,但是,它们似乎都不能满足我的需要 程序非常简单,检查表中是否有重复的唯一数字,例如: select unique_id, count(unique_id) as count_unique from table_name having count(unique_id)>1 group by unique_id 我想创建一个可以调用并动态更改名称和唯一id的过程 比如: declare

一般来说,SQL非常新

我已经看到了一些关于如何在PL/SQL中将表声明为变量的示例,但是,它们似乎都不能满足我的需要

程序非常简单,检查表中是否有重复的唯一数字,例如:

select unique_id,
       count(unique_id) as count_unique
  from table_name
having count(unique_id)>1
 group by unique_id 
我想创建一个可以调用并动态更改
名称和
唯一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;
/

如果希望在运行时更改表,则需要动态SQL,这意味着您需要将所需的SQL语句组装到字符串变量中并执行该字符串。如果您有一个过程,则需要该过程来处理查询结果。我猜您想要返回一个游标

注意,我没有做任何事情来验证表名和列名,以避免SQL注入攻击。您可能希望使用
dbms\u 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;

是的,我想,我需要一个动态SQL来运行这个检查,这样我就可以避免撞到墙了。“你能给我指一下吗?@I.Я.纽伯-对不起,我没听懂。关于动态SQL的任何内容都不会对权限产生任何影响。如果您有查询表的权限,则无论您使用的是动态SQL还是静态SQL,您都有权限。如果您没有权限,则无法查询该表。抱歉,我可能错过了对话-我没有创建过程的权限。也许,一个新问题更适合于当前问题的动态SQL解决方案。-我的问题是关于具有相同目的的动态SQL。