【问题标题】:PL/SQL Loop through a list and find values which not exists in database tablePL/SQL 循环遍历列表并查找数据库表中不存在的值
【发布时间】:2020-02-11 16:07:40
【问题描述】:

我有一个名字列表。但是这个列表很大(10000+ 项)。我想浏览这个值列表并列出表中不存在的值。

我想出了这个,

 select i.column_value as country_code
 from table(SYS.DBMS_DEBUG_VC2COLL('AU', 'IN', 'ZA', 'DK', 'CH', 'NL')) i
 where not exists (select null
                   from country c
                   where c.country_code = i.column_value)

但它将提供给函数的值的数量限制为 1000。因此我无法一次提供完整列表

ORA-00939: too many arguments for function

有没有人知道这个问题的解决方案。

【问题讨论】:

  • 您的 10000 多个项目的列表来自哪里 - 另一个表或文件,或者...您肯定没有输入它们?
  • 是的。我在打字,但不是真的。我正在从文件中复制这些数据。它已经形成了。所以我只需要将它们复制到函数中。
  • 为什么不直接将代码加载到表中,然后将 OUTER JOIN 到国家表中?

标签: sql plsql oracle11g


【解决方案1】:

如果您真的被固定的值列表所困扰,您可以在一个子查询(内联视图)中将多个表集合表达式联合在一起:

select i.column_value as country_code
from (
  select * from table(SYS.odcivarchar2list(
    'AU', 'IN', 'ZA', 'DK', 'CH', 'NL' -- up to 999 entries
  ))
  union all
  select * from table(SYS.odcivarchar2list(
    'AU', 'IN', 'ZA', 'DK', 'CH', 'NL' -- up to 999 entries
  ))
) i
where not exists (select null
                  from country c
                  where c.country_code = i.column_value)

我倾向于使用odcivarchar2list 而不是dbms_debug_vc2coll,但两者都可以使用。

如果数据在文件中,并且您可以在数据库服务器上提供该文件,则可以将其加载为 an external table,这样会减少手动工作。

【讨论】:

  • 将记录分成 999 个块是我正在寻求帮助的问题。
  • 这不是一个真正的 Oracle 问题,它是在您使用 Oracle 之前的文件/文本操作。你如何做到这一点将取决于文件格式和你所在的平台 (OS) 以及可用的工具。不过,我真的建议您查看外部表;或者如果您无法将文件下载到服务器上,请从客户端获取 SQL*Loader。
【解决方案2】:

同意 Alex 的观点,即 外部表 是可行的方法,假设您有权设置目录并将文件复制到数据库服务器。一个快速的赌注是查询all_directories 的现有目录,看看您是否有权将文件复制到那里。此外,dba_external_tables 将向您显示现有的外部表(如果有),您可以描述这些表以显示语法。

如果您缺少权限,您可能需要探索SQL Loader sqlldr 以将原始文件中的代码加载到数据库表中,这将使您的查询更轻松、更快捷。

sqlldr 中使用OPTIONS (DIRECT=TRUE, PARALLEL=TRUE) UNRECOVERABLE 来加快加载速度。

祝你好运,如果您需要更多帮助,请在此回复。

【讨论】:

    猜你喜欢
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2023-03-28
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多