我认为简单的办法应该是在a串的首位都加个逗号,成为',adfa,dgdfg,ertry,xcbbcv,'
然后截取b串中的小段p_b_r,让p_b_r段首位也加上逗号,
判断该加逗号的p_b_r段是否在加个逗号的a段中。如果在返回1,如果不在返回0。
好象比你那样要简单省的那么LOOP那么多

解决方案 »

  1.   

    现在我的代码改为:create or replace function f_include(p_a varchar2,p_b varchar2) return number
    is
      result number:=1;
      p_a_r varchar2(100) :='';
      p_b_r varchar2(100) :='';
      a varchar2(100):=p_a;
      b varchar2(100):=p_b;
    begin
       <<lab1>>
        p_b_r:=substr(b,1,instr(b,',')-1);
        b:=substr(b,instr(b,',')+1);
       <<lab2>>
        p_a_r:=substr(a,1,instr(a,',')-1);
        a:=substr(a,instr(a,',')+1);
        if p_a_r!='' and p_b_r!='' and p_a_r=p_b_r then
          goto lab1;
        elsif  p_a_r!='' and p_b_r!=''and p_a_r!=p_b_r then
          result:=0;
          goto lab2;
        end if;
        return result;
    end;
    /
    select f_include('a,bc,81','b,c'),f_include('a,bc,81','bc,a') from dual;
    /
    但执行结果是:
    SQL> Function createdF_INCLUDE('A,BC,81','B,C') F_INCLUDE('A,BC,81','BC,A')
    -------------------------- ---------------------------
                             1                           1
    为什么阿?!
    elsif  p_a_r!='' and p_b_r!=''and p_a_r!=p_b_r then
          result:=0;
    没有执行到嘛?
      

  2.   

    SQL> select 1 from dual where 'a' != '';未选定行所以用p_a_r != ''会被认为是false,无论p_a_r是否为空。
    这里最好用p_a_r is not null来判断,涉及到的几个都要改。不过你的逻辑还是有问题,简单推理就可以知道。
    两个得出来的结果均为0;
      

  3.   

    CREATE OR REPLACE FUNCTION f_include (p_a VARCHAR2, p_b VARCHAR2)
       RETURN NUMBER
    IS
       TYPE tab IS VARRAY (100) OF VARCHAR2 (10);   t_a      tab            := tab (1,2,3,4,5,6,7,8,9,10);
       t_b      tab            := tab (1,2,3,4,5,6,7,8,9,10);
       a        VARCHAR2 (100) := p_a;
       b        VARCHAR2 (100) := p_b;
       i        INTEGER        := 1;                                 --逗号的位置
       m        INTEGER        := 1;            --a中逗号的数量,控制数组的下标。
       n        INTEGER        := 1;            --b中逗号的数量,控制数组的下标。
       RESULT   NUMBER         := 1;
    BEGIN
       LOOP
          i := INSTR (a, ',');      IF i <> 0
          THEN
             t_a (m) := SUBSTR (a, 1, i - 1);
             a := SUBSTR (a, i + 1);
          ELSE
             t_a (m) := a;
             EXIT;
          END IF;      m := m + 1;
       END LOOP;   LOOP
          i := INSTR (b, ',');      IF i <> 0
          THEN
             t_b (n) := SUBSTR (b, 1, i - 1);
             b := SUBSTR (b, i + 1);
          ELSE
             t_b (n) := b;
             EXIT;
          END IF;      n := n + 1;
       END LOOP;   FOR i IN 1 .. n
       LOOP
          FOR j IN 1 .. m
          LOOP
             IF t_a (j) <> t_b (i)
             THEN
                RESULT := 0;
             ELSE
                RESULT := 1;
                EXIT;
             END IF;
          END LOOP;      IF RESULT = 0
          THEN
             RETURN RESULT;
          END IF;
       END LOOP;   RETURN RESULT;
    END;你试试这个。
      

  4.   

    问题解决了,谢谢大家!
    我还是在原有的基础上改了一下:
    create or replace function f_include(p_a varchar2,p_b varchar2) return number
    is
      result number:=1;
      p_a_r varchar2(100) :='';
      p_b_r varchar2(100) :='';
      a varchar2(100) := p_a || ',';
      b varchar2(100) := p_b || ',';
    begin
      for i in 1..length(b) loop
        p_b_r := p_b_r || substr(b,i,1);
        if substr(b,i,1) = ',' then
          for j in 1..length(a) loop
            p_a_r := p_a_r || substr(a,j,1);
            if substr(a,j,1) = ',' then
              if p_b_r = p_a_r then
                p_a_r := '';
                p_b_r := '';
                goto out_loop;
              elsif j = length(a) then
                return 0;
              end if;
              p_a_r := '';
            end if;
          end loop;
          <<out_loop>>
          null;
        end if;
      end loop;
      return 1;
    end;