【问题标题】: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;
/

【问题讨论】:

    标签: oracle plsql plsqldeveloper


    【解决方案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 解决方案。
    • stackoverflow.com/questions/66902195/… - 我关于具有相同目的的动态 SQL 的问题。
    猜你喜欢
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多