我正在尝试查找从1个数据库到另一个数据库缺少哪些行,我已经链接到两个数据库,我已经发现我不能只加入单独的表,所以我现在正在尝试的是从一个表中选择ID并将其粘贴到另一个DB的select语句中,但我不知道如何将clob解析为条件。
让我进一步解释:
我得到了varchar2的这个集合,我需要检查其他数据库的所有ID,我可以遍历该集合,所以我得到一个带有表单的clob:'id1','id2','id3'
我想在其他数据库上运行此查询
SELECT * FROM atable@db2
WHERE id NOT IN (clob_with_ids)
但我不知道如何告诉PL / SQL将该clob评估为语句的一部分。
atable @ db2上的id字段是一个整数,而我得到的varchar2 id来自于在clob上运行正则表达式
编辑:
我一直要求添加我试图运行的示例:
SELECT *
FROM myTable@db1
WHERE ( (creation_date BETWEEN to_date('14-JUN-2011 00:00:00','DD-MON-YYYY HH24:MI:SS') AND to_date('14-JUN-2011 23:59:59','DD-MON-YYYY HH24:MI:SS')) )
AND acertain_id NOT IN ( SELECT to_number(REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_SUBSTR(payload,'<xmlTag>([[:alnum:]]+)-'),'<xmlTag>',''),'-','')) as sameIDasOtherTable
FROM anotherTable@db2
WHERE condition1 ='bla'
AND condition2 ='blabla'
AND ( (creation_date BETWEEN to_date('14-JUN-2011 00:00:00','DD-MON-YYYY HH24:MI:SS') AND to_date('14-JUN-2011 23:59:59','DD-MON-YYYY HH24:MI:SS')) ) )
ORDER BY TO_CHAR(creation_date, 'MM/DD/YYYY') ASC;
我收到错误ORA-22992
有任何建议吗?
答案 0 :(得分:4)
在我看来,你已投入大量时间来开发错误的解决方案。一种更简单的解决方案是使用SET运算符。此查询检索ATABLE的本地实例中在同一个表的远程实例中缺少的所有ID:
select id from atable
minus
select id from atable@db2
如果您的心脏设置为检索整个本地行,您可以尝试反加入:
select loc.*
from atable loc
left join atable@db2 rem
on (loc.id = rem.id )
where rem.id is null
/
答案 1 :(得分:3)
我不相信你能做到这一点,但我在很多场合被证明是错的......即使你能找到办法让它把CLOB的内容当作{{{ 1}}你可能会很快达到1000项限制(ORA-01795)。
我不确定你的意思'我已经发现我不能只是加入单独的表'。为什么你不能这样做:
IN
或者:
SELECT * FROM atable@db2 WHERE id NOT IN (SELECT id FROM atable@db1)
(或者使用@ APC的反连接,这可能更高效!)
在远程数据库上加入大型表可能存在性能问题,但看起来您必须在某个时刻执行此操作,如果这是一次性任务,那么它可能是可以忍受的。
使用加入错误更新问题后编辑
ORA-22992是因为你试图从远程数据库中提取CLOB,这似乎不起作用。由此我假设你提到无法加入是因为你是joining two remote tables。
简单的选项不是拉所有列 - 指定你需要的而不是SELECT * from atable@db2 WHERE id IN (
SELECT id FROM atable@db2 MINUS SELECT id FROM atable@db1)
。如果你确实需要CLOB值,我唯一可以建议尝试使用CTE(select *
),但我真的不知道这是否避免了双链接限制。或者将ID拉入本地临时表;或者在其中一个远程数据库上运行查询。