用于重复检查的动态 SQL - Oracle PL/SQL

Dynamic SQL for duplicates check - Oracle PL/SQL

由于本人权限有限,无法创建以下程序。

我需要有关开发动态 SQL 的帮助,该动态 SQL 检查 table 是否有重复的唯一 ID。 另外,是否可以有多个 table 来检查相同查询的重复项?

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

如果您不能创建存储过程(或函数),您将注定 成为匿名PL/SQL 块。这是一个在 SQL*Plus 中有效的方法(可能也在 SQL Developer 中)。阅读代码中的注释。

斯科特的 EMP table,就业人数是

SQL> select job, count(*) from emp group by job;

JOB         COUNT(*)
--------- ----------
CLERK              4
SALESMAN           4
PRESIDENT          1
MANAGER            3
ANALYST            2

SQL>

你会

SQL> declare
  2    l_table  varchar2(30) := '&PAR_TABLE_NAME';
  3    l_column varchar2(30) := '&PAR_COLUMN_NAME';
  4    l_str    varchar2(500);
  5    l_rc     sys_refcursor;
  6    --
  7    l_ret_column varchar2(30);
  8    l_ret_cnt    number;
  9  begin
 10    -- compose a SELECT statement
 11    l_str := 'select '    || l_column || ', count(*) cnt '   ||
 12             ' from '     || l_table  ||
 13             ' group by ' || l_column ||
 14             ' having count(*) > 1';
 15
 16     -- use L_STR as a "source" for the L_RC (ref)cursor
 17     open l_rc for l_str;
 18
 19     -- loop, fetch data, display what you've found
 20     loop
 21       fetch l_rc into l_ret_column, l_ret_cnt;
 22       exit when l_rc%notfound;
 23
 24       dbms_output.put_line(l_table ||'.'|| l_column ||' = ' ||
 25                              l_ret_column ||', ' || l_ret_cnt || ' row(s)');
 26     end loop;
 27
 28     close l_rc;
 29  end;
 30  /
Enter value for par_table_name: emp
Enter value for par_column_name: job
emp.job = CLERK, 4 row(s)
emp.job = SALESMAN, 4 row(s)
emp.job = MANAGER, 3 row(s)
emp.job = ANALYST, 2 row(s)

PL/SQL procedure successfully completed.

SQL>