现在我的存储过程中有个需求,游标调用的SQL中有个条件
这个条件简单说就是:字段A NOT LIKE (集合B)
说明:集合B是从另一张表查询出来的(那张表的数据个数不确定),我知道上面的写法不正确,所以在这里请教大家其实有另一种实现方式,那就是用另一个游标遍历集合B所在的表,然后拼装查询条件,例如 A NOT LIKE b1 and A NOT LIKE b2........
这种方式首先我觉得不太好,而且有个问题,一般来说我都是将SQL存放在varchar中,但是游标执行的SQL最多只有5000,现在的情况是我的查询SQL本来就很长了,在加上这个动态的查询条件,肯定超过5000,所以不能用varchar,但是不用varchar应该用什么数据格式存储SQL这个超长SQL呢?如果是使用LOB,那到底是使用CLOB还是使用BLOB呢?使用LOB数据存储SQL在游标执行SQL的时候是否又要转换呢?具体应该怎么做?希望能有DX帮忙解惑,不胜感谢!再说点题外话,这项目是2月份做的,现在还要改,我郁闷............

解决方案 »

  1.   

    select * from a
    where not exists(
      select 1 from b
      where a.a like '%'||b.b||'%')
      

  2.   

    9i及其之后的版本:
    varchar2型的字段可以存4000bytes,varchar2型的变量可以记录32767bytes的数据
    Oracle 8
    4000bytes
    Oracle 7
    2000bytes存储过程中sql长度达到32767bytes,这个还真不容易,所以尽管放心用varchar2吧
      

  3.   


    a.a like '%'||b.b||'%'
    这一段需要动态拼装,但是拼装出来的动态SQL肯定不可能放入VARCHAR2中去,长度肯定超了,如果用CLOB的话我不是很清楚怎么用
      

  4.   


    晕死,我知道VARCHAR2的长度就这一点,我可以明确的说,我的动态SQL肯定超了已经(很复杂的SQL)