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

Posted

技术标签:

【中文标题】用于重复检查的动态 SQL - Oracle PL/SQL【英文标题】:Dynamic SQL for duplicates check - Oracle PL/SQL 【发布时间】:2021-04-01 09:44:17 【问题描述】:

由于我的权限有限,无法创建以下程序。

我需要有关开发用于检查表中是否存在重复唯一 ID 的动态 SQL 的帮助。 此外,是否可以使用相同的查询检查多个表的重复项?

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】:

如果您无法创建存储过程(或函数),那么您注定 将使用匿名 PL/SQL 块。这是在 SQL*Plus 中工作的一个(可能也在 SQL Developer 中)。在代码中读取 cmets。

对于 Scott 的 EMP 表,作业数为

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>

【讨论】:

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

动态 SQL/异常处理 -00942 - Oracle PL/SQL [重复]

用于 oracle 11g 的 PL/SQL 中的嵌入式脚本 [重复]

检查架构中的 IF 表 EXISTS 时发生 Oracle PL/SQL 过程错误 [重复]

如何修复存储过程 Oracle PL/SQL 的错误?

Oracle PL/SQL 动态更改变量值的问题

Oracle 游标简介