将varchar2字符串计算为SQL语句的条件

时间:2011-06-21 20:25:11

标签: sql oracle plsql

我正在尝试查找从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

有任何建议吗?

2 个答案:

答案 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拉入本地临时表;或者在其中一个远程数据库上运行查询。