我认为简单的办法应该是在a串的首位都加个逗号,成为',adfa,dgdfg,ertry,xcbbcv,'
然后截取b串中的小段p_b_r,让p_b_r段首位也加上逗号,
判断该加逗号的p_b_r段是否在加个逗号的a段中。如果在返回1,如果不在返回0。
好象比你那样要简单省的那么LOOP那么多
然后截取b串中的小段p_b_r,让p_b_r段首位也加上逗号,
判断该加逗号的p_b_r段是否在加个逗号的a段中。如果在返回1,如果不在返回0。
好象比你那样要简单省的那么LOOP那么多
解决方案 »
- oracle用exp建数据库备份时不能备份各位高手给看看谢谢!
- 如何使用object libraries(对象库)这个功能啊
- ORACLE8.1.6建立全文索引出错,高手帮忙看一下
- 请教大家,如何验证rac系统下rman备份和归档的可用性
- 联通公司的收费系统是用的oracle吗?
- oracle快照问题
- 如何格式化整数或实数为小数? 请帮忙!
- 如何设计这个表能达到最好的效果?
- 求SQL语句 在线等待
- 在线等待!Select * from tblname as a inner join ...
- 函数中使用SELECT怎么有错误提示?
- 我对表的索引进行了“分析”后得出一些数据,但不知怎么估算每一条记录索引的大小?
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;
没有执行到嘛?
这里最好用p_a_r is not null来判断,涉及到的几个都要改。不过你的逻辑还是有问题,简单推理就可以知道。
两个得出来的结果均为0;
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;你试试这个。
我还是在原有的基础上改了一下:
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;