检查表是不是重复的过程 - Oracle PL/SQL

Posted

技术标签:

【中文标题】检查表是不是重复的过程 - Oracle PL/SQL【英文标题】:Procedure to check table for duplicates - Oracle PL/SQL检查表是否重复的过程 - Oracle PL/SQL 【发布时间】:2021-04-01 06:51:40 【问题描述】:

一般来说对 SQL 很陌生。

已经看过一些关于如何在 PL/SQL 中将表声明为变量的示例,但是,它们似乎都没有满足我的需求。

过程很简单,检查表中重复的唯一数字,例如:

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

【问题讨论】:

【参考方案1】:

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

请注意,我没有做任何事情来验证表名和列名以避免 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;

【讨论】:

是的,我想,我需要一个动态 SQL 来运行这个检查,这样我就可以避免遇到特权墙。你能指出我吗? @I.Я.Newb - 抱歉,我不关注。动态 SQL 对权限没有任何影响。如果您具有查询表的权限,那么无论您使用的是动态 SQL 还是静态 SQL,您都具有权限。如果您没有权限,则无法查询该表。 抱歉,我可能说错了 - 我没有创建程序的权限。也许,一个新问题会更适合当前问题的动态 SQL 解决方案。 ***.com/questions/66902195/… - 我关于具有相同目的的动态 SQL 的问题。

以上是关于检查表是不是重复的过程 - Oracle PL/SQL的主要内容,如果未能解决你的问题,请参考以下文章

整行不匹配时的oracle合并语句[重复]

Oracle 存储过程插入非重复值和外键约束的考虑

如何在oracle中检查对象是不是存在[重复]

oracle 怎么检查字段是不是存在某值?

如何在存储过程中动态传递表名 - ORACLE [重复]

如何根据Oracle中的值查找表名[重复]