PL/SQL循环遍历列表并查找数据库表中不存在的值

PL/SQL循环遍历列表并查找数据库表中不存在的值,sql,plsql,oracle11g,Sql,Plsql,Oracle11g,我有一张名单。但是这个列表相当大(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

我有一张名单。但是这个列表相当大(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

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

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

我倾向于使用
odcivarchar2list
而不是
dbms\u debug\u vc2coll
,但它应该可以与这两者一起使用


如果数据在一个文件中,并且您可以在数据库服务器上使其可用,则您可以将其作为加载,这将减少手动操作。

如果您确实需要固定的值列表,则可以在子查询(内联视图)中合并多个表集合表达式:

我倾向于使用
odcivarchar2list
而不是
dbms\u debug\u vc2coll
,但它应该可以与这两者一起使用


如果数据在一个文件中,并且您可以在数据库服务器上使用该文件,则您可以将其作为加载,这将减少手动操作。

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

如果您缺乏权限,您可能需要浏览
sqlldr
,将原始文件中的代码加载到数据库表中,这将使您的查询更容易、更快

sqlldr
中,使用
选项(DIRECT=TRUE,PARALLEL=TRUE)UNRECOVERABLE
加速加载


祝你好运,如果你需要更多帮助,可以在这里聊天。

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

如果您缺乏权限,您可能需要浏览
sqlldr
,将原始文件中的代码加载到数据库表中,这将使您的查询更容易、更快

sqlldr
中,使用
选项(DIRECT=TRUE,PARALLEL=TRUE)UNRECOVERABLE
加速加载


祝你好运,如果你需要更多帮助,请回到这里聊天。

你的10000多个项目列表来自哪里-另一张表,或一个文件,或。。。你肯定没有把它们打进去?是的。我在打字,但不是真的。我正在从文件中复制这些数据。它已经形成了。因此,我只需将它们复制到函数中。为什么不将代码加载到一个表中,并将其外部联接到country表中?10000多个项目的列表来自何处-另一个表、文件或。。。你肯定没有把它们打进去?是的。我在打字,但不是真的。我正在从文件中复制这些数据。它已经形成了。所以我只需要将它们复制到函数中。为什么不将代码加载到一个表中,并将其外部连接到country表中呢?将记录拆分为999个数据块是我正在寻求帮助的问题。这不是Oracle的真正问题,而是在访问Oracle之前对文件/文本进行的操作。如何做到这一点将取决于文件格式、您所在的平台(OS)和可用的工具。但我真的建议您查看外部表;或者,如果您无法将文件放到服务器上,请从客户端使用SQL*Loader。将记录拆分为999个数据块是我正在寻求帮助的问题。这不是Oracle的真正问题,而是在您访问Oracle之前对文件/文本进行的操作。如何做到这一点将取决于文件格式、您所在的平台(OS)和可用的工具。但我真的建议您查看外部表;或者,如果无法将文件放到服务器上,请从客户端使用SQL*Loader。
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)