PL/SQL循环遍历列表并查找数据库表中不存在的值
我有一张名单。但是这个列表相当大(10000多个项目)。我想浏览这个值列表,然后列出表中不存在的值 我能想出这个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
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)